frompwnimport* io = remote('111.198.29.45','39532')#io = process('./pwn200')#context.log_level= 'debug'elf = ELF('./pwn200') ppp_r =0x80485cdread_got = elf.got['read'] read_plt = elf.plt['read'] main_addr =0x80484bestart_addr =0x80483d0write_plt = elf.plt['write']...
拖进IDA64 查看,点击左侧main,F5 查看反编译代码,发现其中返回一个vulnerable_function脆弱的函数: 点击查看,发现函数功能是往一个最多 128 字节的 buf 内读入最多0x200即 512 个字节,根据上一题经验我们可以往 高地址( buf\space下方) 修改我们需要的数据。 由于buf 是局部变量,所以系统会将其存储在栈内。我...
第一题:level0 通过观察程序代码,发现这是一个64位Linux可执行程序,调用了有漏洞的函数。该函数直接读取0x200个字符,但栈空间只有0x80个字符,从而形成缓冲区溢出。利用CTF工具PwnTools,通过缓冲区溢出覆盖调用callsystem函数的地址,从而获得shell控制。第二题:when_did_you_born 程序同样是一个64位...
write(1, "Hello, World\n", 0xDuLL); return vulnerable_function(); } // 跳转到vulnerable_function() ssize_t vulnerable_function() { char buf; // [rsp+0h] [rbp-80h] return read(0, &buf, 0x200uLL); } // 显然我们可以看到有一个read函数,既可任意读取。双击buf进入 // 很显然可以看...
攻防世界 - pwn - pwn-200 这题用到了rop和ret2libc,漏洞是栈溢出: voidvuln(void){charlocal_70[108];setbuf(stdin,local_70);read(0,local_70,0x100);return;} 没有后门和syscall,没有open也不是orw,且checksec中没开PIE和canary: checksec pwn-200...
栈溢出加ROP,输入逻辑如下: 输入逻辑为从标准输入流严格读入200个字节,因此输入的时候不能sendline,需要限制字节数。调试得到偏移量,剩下的就是做ret2libc了...
攻防世界pwn200 因为学校放假再加上回家学车,学习进度耽搁一段时间。算了废话少说 来看题 用ida分析 发现与之前做的level3极其相似 但是没有给libc库,所以我们得安装LibcSearcher这个能根据你所给的函数来计算libc的版本,进而得到system和bin_sh的地址 这里是准备工作 这里是获取pwn200文件中的有用地址 这里通过...
基于上道题(stack2),我总结些GDB的使用。 运行下面的脚本(不要在vscode里面运行,会调用gdb失败) deff(addr, data):p.sendlineafter('5. exit','3') p.sendlineafter('which number to change:', str(addr)) p.sendlineafter('new number:', str(data))frompwnimport* ...
基于上道题(stack2),我总结些GDB的使用。 运行下面的脚本(不要在vscode里面运行,会调用gdb失败) 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 deff(addr, data): p.sendlineafter('5. exit','3') ...
file level0,再查一下这个文件的保护机制 64位,拖进ida 比较简单,跟进函数 想到溢出,读入200个字节,比较大的 没有什么有用的信息了,查找字符串 猜测flag可能是在文件中 进一步跟进后,反汇编是这个样子,想到通过栈溢出来覆盖,改变地址来跳转到callsystem函数处。 # -