从题目中可以看出,本题应该是一个没有提供system函数地址的栈溢出题目,那么我们本题的考点应该是从libc中提取system函数地址。照例检查保护机制root@mypwn:/ctf/work/python# checksec level3 [*] '/ctf/work/python/level3'Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000)只是开启了NX,那就没错了,可以执行栈溢出。打开ida看下反编译c语言代码:int __cdecl main(int argc, const char **argv, const char **envp) { vulnerable_function(); write(1, "Hello, World!\n", 0xEu); return 0; } ssize_t vulnerable_function() {
1.查看文件保护64位,开启了NX(数据不可执行)、Canary(栈保护)和Full RELRO(无法修改GOT表)运行程序图画之后的提示中有两个secretsecret[0] is 12b32a0secret[1] is 12b32a4用户输入名字后,出现一大段故事,接着有两次选择:(1)east or up?选up后会让用户重新选择,所以只能选east(2)选east后:there(1)or leave(0)?输入0选择leave,则程序输出一段字符后程序退出输入1后程序提示用户输入一个地址和一个愿望,接着程序输出一段字符后退出2.IDA静态分析(1)main程序逻辑分析:1)启动计时器后执行sub_400996,接着定义数组v4,且v4[0]=68,v4[1]=852)第13、14行给出的secret是v4[0](68)和v4[1](85)的地址3)输出一系列字符串后执行sub_400D72(2)sub_400996输出off_603010,跟进后发现为asc_400F98,内容为龙的图画(3)sub_400D72判断角色名长度小于0x28,执行之后三个函数1)sub_400A7
1.查看文件保护32位,只开启了NX(数据不可执行)kali中运行程序一个留言板程序,用户可以输出名字和一条信息。2.IDA静态分析(1)main(2)hello第29行fgets接收用户输入到变量name中,双击跟进发现其在.bss段,地址为0804A080函数末尾发现gets()函数,并且数组s与ebp的位移为0x26,因此写0x26+4个字节后即可覆盖返回地址(3)查看字符串窗口没有发现/bin/sh字符串,但是左侧函数窗口中有system函数,地址为08048420还找到一个pwn函数,执行系统命令输出字符串,由此得call __system地址为0804855A因此构造一个/bin/sh作为system执行的参数即可getshell(4)思路整理利用fgets函数溢出后返回地址修改成system()函数,内容用/bin/sh覆盖EXP代码如下:from pwn import * p = remote('61.147.171.105', 63915) payload=b'a'*(0x26+4)+p32(0x0804855A)+p32(0x0804A080) # 或者是直接调
1.查看文件保护题目名提示为整数溢出ELF32 开启了NX(数据不可执行)运行程序欢迎提示后是一个选项,选1则要求输入名字和密码,判断后输出提示,退出程序;选2则直接退出程序2.IDA静态分析(1)main较为简单的程序逻辑:选1后执行login()(2)login()接收长度为0x19的username并在Hello中输出再接收一个为0x199的passwd返回中执行check_passwd()跟进check_passwd()passwd长度为3-7时提示成功,在范围之外提示失败,并且在输出提示后清空输出缓冲区,最后执行strcpy将passwd复制给dest并返回用来存储passwd的变量v3类型为无符号的int8,范围为[0,255],超出255就会发生整数溢出,而程序读入passwd输入时,大小为0x199,远远超出此范围,因此可以利用。(3)查看字符串窗口看到关键字符cat flag跟进并查看交叉引用找到一个what_is_this()函数,其内容为执行系统命令输出flag内容,其地址为0804868B(4)思路整理构建一个指定长度的串,传入函数,整数溢出突破if函数的判断,
一、查看文件保护ELF32 开启了NX(堆栈不可执行)以及 CANNARY(栈保护),未开启 PIE 程序内存加载基地址随机化保护机制(即静态反汇编的地址可以直接使用)kali中运行如下让我们输入一个名字和一条信息后,输出hello以及我们输入的信息,最后输出“Thank you”后退出程序二、IDA静态分析(1)main程序逻辑分析:1. 接收由用户输入字符串 buf 和 s,依次作为名字和信息进行打印; 2. 注意如果 pwnme == 8 这个条件满足,则执行 system(“cat flag”) 输出我们想要的目标信息 flag 值; (2)跟进变量pwnme发现是.bss段上的全局变量(3)整理思路main函数中第22行的print(s)存在格式化字符串漏洞所以解题思路为:借助格式化字符串漏洞,实现任意地址写,篡改 pwnme 全局变量的值并令其等于 8,即可获得 Flag。三、解题任意地址覆写格式化字符串漏洞的任意地址覆写的利用步骤跟任意地址读取的利用步骤类似:1. 确定格式化字符串漏洞受控参数在栈中的偏移量 n; 2. 确定你需要读内存的地址 target_address
Norman1z