ret2syscall
拿到附件检查一下保护,拿到ida中打开


将断点下到call函数,此时ESP,EBP地址通过v4的相对索引可以推算出v4的空间,为108,+4为112

发现代码有‘/bin/sh’,可以用execve()系统函数调用
该程序是 32 位,所以我们需要使得
系统调用号,即 eax 应该为 0xb
第一个参数,即 ebx 应该指向 /bin/sh 的地址,其实执行 sh 的地址也可以。
第二个参数,即 ecx 应该为 0
第三个参数,即 edx 应该为 0
而我们如何控制这些寄存器的值 呢?这里就需要使用 gadgets。比如说,现在栈顶是 10,那么如果此时执行了 pop eax,那么现在 eax 的值就为 10。但是我们并不能期待有一段连续的代码可以同时控制对应的寄存器,所以我们需要一段一段控制,这也是我们在 gadgets 最后使用 ret 来再次控制程序执行流程的原因。具体寻找 gadgets 的方法,我们可以使用 ropgadgets 这个工具。

eax地址选择为 0x080bb196

选择0x0806eb90控制edx,ecx,ebx ret

找到字符出地址,该程序为32位,系统调用号为0xb,int_0x80来触发execve()系统调用
找到int_0x80地址

所有地址都找到了,开始构造exp
1 | from pwn import * |
通过此题更深一步了解了栈溢出
并且学会了ROPgadgets的使用