ROP(X86)
(学习记录)跟着蒸米学ROP
- JarvisOJ-Pwn-level1
- JarvisOJ-Pwn-level2
- JarvisOJ-Pwn-level3
- JarvisOJ-Pwn-level4
- 国赛技能赛华东区线下赛 pwn12
基本原理
待施工…
练习题
JarvisOJ level1
发现问题函数
计算得到会溢出的位数为0x8C,并未发现callsystem之类的函数,需要自己构造shellcode。编写攻击代码如下
1 | from pwn import * |
JarvisOJ level2
该程序中存在System函数和‘/bin/sh’字符串,直接调用它们,在x86中函数的参数是直接通过栈来传递的,第一个参数是ebp+0x8,在构造payload的时候注意参数的配置。并且由于延迟绑定技术,.plt段中的内容是实现跳转操作的代码片段,所以system函数的地址可以通过查看plt表获得。综上,得到如下exp函数。
1 | from pwn import * |
JarvisOJ level3
程序中没有直接给出system函数和’/bin/sh’字符串,但是.so文件中有我们需要的函数和字符串。并且这个程序调用过write函数,我们知道由于延迟绑定技术,可执行文件中的.got和.plt中的地址并不是目标地址,而是动态连接器中的地址。在程序执行的第一次调用时,动态链接器才把got表和plt表中的地址填写正确。所以我们要泄露出write函数的地址,再结合偏移地址和内存地址的关系计算出system函数和’/bin/sh’的地址。
1 | from pwn import * |
JarvisOJ level4
在未能得到程序调用的libc文件的情况下,我们就需要通过泄露内存的手段来获取libc中某函数的地址,然后通过版本对比得到其它函数或字符串的偏移量达到调用system(‘/bin/sh’)的目的。
这道题目并没有给出libc文件,首先通过payload1调用write函数输出libc中某个函数得实际地址,在下面代码中使用得write函数。然后通过LibcSearcher得到对应libc得版本号,从而获得system函数和”/bin/sh”字符串的相对地址。
1 | from pwn import * |
国赛技能赛华东区线下赛 pwn12
foo函数里,在gets函数后有一个puts输入内容的函数,要先接收puts的内容才能获得puts的内存地址。
1 | from pwn import * |