ROP攻击前提:
- 存在栈溢出并且可以控制返回地址
- 存在满足条件的gadget,如果开启了PIE保护则要想办法泄露gadget的地址
ret2text
程序本身存在类似于system('/bin/sh')或者execv('/bin/sh')的片段,我们可以直接将返回地址覆盖为其地址跳转到已有代码上。
例子:
TODO
ret2shellcode
这种方法要求我们自己构造shellcode并控制程序跳转到我们构造的shellcode处运行。一般情况下我们都是向栈中缓冲区写入shellcode,这种情况需要程序关闭NX,
例子 :ret2shellcode
检查程序发现没有开启任何保护
qts@qts-PC:~/奇幻世界/杂题/ret2shellcode$ ./checksec.sh --file ret2shellcode
RELRO STACK CANARY NX PIE RPATH RUNPATH FILE
Partial RELRO No canary found NX disabled Not an ELF file No RPATH No RUNPATH ret2shellcode
可以看到这里将内容复制到位于bss段的buf2中。
int __cdecl main(int argc, const char **argv, const char **envp)
{
int v4; // [sp+1Ch] [bp-64h]@1
setvbuf(stdout, 0, 2, 0);
setvbuf(stdin, 0, 1, 0);
puts("No system for you this time !!!");
gets((char *)&v4);
strncpy(buf2, (const char *)&v4, 0x64u);
printf("bye bye ~");
return 0;
}
查看一下bss段是否可执行
readelf -S ret2shellcode查看bss段位于0x804a040
[24] .data PROGBITS 0804a028 001028 000008 00 WA 0 0 4
[25] .bss NOBITS 0804a040 001030 0000a4 00 WA 0 0 4
gdb调试vmmap命令查看,发现bss段可读可写可执行。
gef➤ vmmap
Start End Offset Perm Path
0x08048000 0x08049000 0x00000000 r-x /home/qts/奇幻世界/杂题/ret2shellcode/ret2shellcode
0x08049000 0x0804a000 0x00000000 r-x /home/qts/奇幻世界/杂题/ret2shellcode/ret2shellcode
0x0804a000 0x0804b000 0x00001000 rwx /home/qts/奇幻世界/杂题/ret2shellcode/ret2shellcode
0xf7dfd000 0xf7fae000 0x00000000 r-x /lib/i386-linux-gnu/libc-2.24.so
0xf7fae000 0xf7fb0000 0x001b0000 r-x /lib/i386-linux-gnu/libc-2.24.so
0xf7fb0000 0xf7fb1000 0x001b2000 rwx /lib/i386-linux-gnu/libc-2.24.so
我们可以将shellcode写入bss段,并控制程序跳转到shellcode处
exp如下:
##!/usr/bin/env python
from pwn import