这里总结一下shellcode的各种类型
一、直接调用
1 |
|
很骚的一题,又是将system禁用的堆类型题目
1 | $ seccomp-tools dump ./pwn2 |
1 | Ign:1 http://security.ubuntu.com/ubuntu disco-security InRelease |
checksec 一下发现加了upx壳,upx -d 脱壳
IDA f5发现
1 | _BOOL8 __fastcall sub_4009AE(char *a1) |
brain fuck,类似vm吧,可以进行读写,移位,加减操作。
所以移位操作和读写操作结合起来其实就是任意地址写,且got表可写。
思路:
先通任意地址读,读取got表上的libc地址,然后通过任意地址写将putchar@got修改为main,返回到main函数。
第二次输入的时候修改putchar@got为onegadget即可
1 | #include <stdio.h> |
gets(s)栈溢出,且没有canary,没有PIE
本来想的是通过栈溢出直接跳到 if 内部输出flag,不过其地址为0x80A010B
结合gets函数遇到回车(‘\x0a’)结束输入的特性,无法将地址0x80A010B
写到返回地址上去。这个一步到位的方法pass。