0x01 ret2libc1
ida导入后的main函数如下
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
然后我们发现有plt表中有system
在linux中用checksec查看保护
1 | Arch: i386-32-little |
ida中按shift+F12 然后查看字符串发现/bin/sh
如果要用过gdb查找的话 只需要输入 search /bin/sh
我们通过cyclic直接算出溢出偏移
1 | cyclic 500 |
溢出思路
第一次gets,将ret覆盖直接到system的位置,并且传入/bin/sh的地址,由于只需要一次ret,所以我们不需要设置padding
exploit.py
1 | from pwn import * |
0x02 ret2libc2
文件导入ida后,发现有system函数但是没有现有的"/bin/sh",所以需要通过gets函数在bbs中输入该字符串,然后跳转到system函数
获取溢出的字符串长度方法和0x01中的方法相同
由于有第二次ret,所以我们需要设置padding,也就是pop edx
查找的方法可以用ROPgadget
1 | ROPgadget --binary ret2libc2 --only "pop|ret" |
exploit.py
1 | from pwn import * |
0x03 ret2libc3
首先我们程序拖入ida,没有发现system函数,也没有发现"/bin/sh",但是有put函数和__libc_start_main,我们可以采取溢出libc的版本号,然后算出libc中system函数的位置,然后把"/bin/sh"参数传入,其中注意再返回main函数时,请不要直接ret到main函数,不然会因为main参数未传入而导致程序崩溃,请跳转到_start函数,然后_start函数中可以传入参数并跳转到main
exploit.py
1 | from pwn import * |
0x04 ret2text
导入ida,发现system("/bin/sh")
checksec检查一下
1 | Arch: i386-32-little |
只有NX保护,可以直接跳转到system函数
溢出思路
直接通过gets覆盖ret地址,直接跳转到system函数
exploit.py
1 | from pwn import * |
0x05 ret2shellcode
溢出思路
将shellcode写入后,因为strcpy的原因,会将shellcode保存到非栈的区域,所以直接跳转到该区域就可以执行shellcode拿到shell
exploit.py
1 | from pwn import * |
0x06 ret2syscall
文件下载rop
首先我们先导入IDA,然后F5反编译
我们用gdb进行调试,首先我们先生成较多的字符串来测试它ret_address的长度
1 | cyclic 200 //复制 |
然后会看到它的ret_address是非正常的数据(其实是我们输入的字符串的一部分)
然后我们将它提取出来,获取它的长度
1 | cyclic -l 0x62616164 |
这个指令输出 112,说明只要我们输入112个字符之后就可以控制住程序的流程了,想让它跳哪里就跳到哪里
但是让它跳哪里我们还不知道,所以我们需要一个工具 ROPgadget
1 | ROPgadget --binary rop --ropchain |
然后它会在最后构造一个python代码
1 | from struct import pack |
下面给出exploit
1 | from struct import pack |