BUUCTF test_your_nc
- 安装
pwntools
在已安装python和pip后,直接
pip install pwntools
- 使用
checksec,检测文件的保护机制
checksec在下载好pwntools后就有

发现test文件为64位,部分开启RELRO,开启了NX防护和PIE
- RELRO(ReLocation Read-Only)堆栈地址随机化:
Full Relro保护与Linux下的Lazy Binding机制有关,其主要作用是禁止.GOT.PLT表和其他一些相关内存的读写,从而阻止攻击者通过写.GOT.PLT表来进行攻击利用的手段。
RELRO会有Partial RELRO和FULL RELRO,如果开启FULL RELRO,意味着我们无法修改got表。
GCC开启Full Relro的方法是添加参数“-z relro”。- Stack Canary 栈溢出:
Stack Canary保护是专门针对栈溢出攻击设计的一种保护机制。由于栈溢出攻击的主要目标是通过溢出覆盖函数栈高位的返回地址,因此其思路是在函数开始执行前,即在返回地址前写入一个字长的随机数据,在函数返回前校验该值是否被改变,如果被改变,则认为是发生了栈溢出。程序会直接终止。
如果栈中开启Canary found,那么就不能直接用溢出的方法覆盖栈中返回地址,而且要通过改写指针与局部变量、leak canary、overwrite canary的方法来绕过。
GCC默认使用Stack Canary保护,关闭方法是在编译时加入“-fno-stack-protector”参数。- NX(the No-eXecute bits)缓冲区溢出:
NX保护在Windows中也被称为DEP,是通过现代操作系统的内存保护单元(Memory Protect Unit,MPU)机制对程序内存按页的粒度进行权限设置,其基本规则为可写权限与可执行权限互斥。因此,在开启NX保护的程序中不能直接使用shellcode执行任意代码。所有可以被修改写入shellcode的内存都不可执行,所有可以被执行的代码数据都是不可被修改的。以前的call esp或者jmp esp的方法就不能使用,但是可以利用rop这种方法绕过。
GCC默认开启NX保护,关闭方法是在编译时加入“-z execstack”参数。- ASLR(Address Space Layout Randomization):
ASLR的目的是将程序的堆栈地址和动态链接库的加载地址进行一定的随机化,这些地址之间是不可读写执行的未映射内存,降低攻击者对程序内存结构的了解程序。这样,即使攻击者布置了shellcode并可以控制跳转,由于内存地址结构未知,依然无法执行shellcode。
ASLR是系统等级的保护机制,关闭方式是修改/proc/sys/kernel/randomize_va_space文件的内容为0。- PIE(Position-Independent Executable)地址无关可执行文件:
与ASLR保护十分相似,PIE保护的目的是让可执行程序ELF的地址进行随机化加载,从而使得程序的内存结构对攻击者完全未知,进一步提高程序的安全性。
PIE enabled地址随机化选项就意味着程序每次运行的时候地址都会变化,而如果没有开PIE的话那么No PIE (0x400000),括号内的数据就是程序的基地址。
GCC编译时开启PIE的方法为添加参数“-fpic-pie”。较新版本GCC默认开启PIE,可以设置“-no-pie”来关闭。
- 静态分析test文件,利用
ida64打开
int __cdecl main(int argc, const char **argv, const char **envp)
{
system("/bin/sh");
return 0;
}
直接NC就行
4. 利用NC(netcat),其主要用途是建立和监听任意TCP和UDP连接,支持ipv4和ipv6,因此,可以用来网络调试、端口扫描等。
NC指令:nc ip port
-z:连接成功后立即关闭连接,不进行数据交换
-v:输出详细的交互内容

- 得到flag
flag{3d8efe4b-dd63-4242-a89f-ccdc229ee880}
参考链接:
https://blog.csdn.net/bing_Max/article/details/119947896
https://www.cnblogs.com/HacTF/p/8052175.html
https://www.oschina.net/translate/linux-netcat-command
《从0到1:CTFer成长之路》/Nu1L战队

浙公网安备 33010602011771号