iT邦幫忙

2024 iThome 鐵人賽

DAY 15
0
Security

從0開始的打Pwn教學系列 第 15

【Day-15】Reverse Call Function - 2

  • 分享至 

  • xImage
  •  

在這支程式比較會有疑問的地方應該是puts和printf的前置作業差別,puts只需要有個字串就可以輸出了,而printf需要字串和我們在printf Function雙引號內打的內容。
不懂就問man,可以看到在puts的定義,參數的部分就吃要print的內容就好,很單純。
https://ithelp.ithome.com.tw/upload/images/20240929/20169016u4WKWAW1VG.jpg

而printf,除了吃字串以外,還要吃一個指定的格式,也就是我們所輸入的%s。
https://ithelp.ithome.com.tw/upload/images/20240929/201690164EzIu2BzF2.jpg

這也可以得知由於puts所需要的資源比較少,因此在做最佳化時,如果沒有太複雜的輸出,編譯器很可能會將printf改為puts來加快程式運作的速度。

還有一個點是在GDB當中,程式在Call printf前會將EAX設為0,而IDA則沒有,這也是Calling conventions的問題,在System V x86-64 psABI當中,由於printf是可變參數函式,因此在Call printf時需要EAX來做引導,所以EAX並不一定是0,如果程式當中有參數是需要儲存在向量暫存器當中的,例如Float,則EAX就會有所變化,這邊寫一個小程式去輸出一個Float格式,可以看到EAX會設定為0x1。
https://ithelp.ithome.com.tw/upload/images/20240929/20169016hBw8ICMd8q.png
https://ithelp.ithome.com.tw/upload/images/20240929/20169016dClRchMsTS.png

同理,如果Call A Function是傳送Float格式也會有不一樣的變化,這邊的小程式會送一個Float格式給A Function,可以看到在Call A之前的作業不是將EAX設為0了,未來在做Reverse的時候會遇到更多的Calling conventions問題。
https://ithelp.ithome.com.tw/upload/images/20240929/20169016ErLTmufaaa.jpg
https://ithelp.ithome.com.tw/upload/images/20240929/20169016ySwGDzsCX1.jpg


上一篇
【Day-14】Reverse Call Function - 1
下一篇
【Day-16】Reverse Call Function - 3
系列文
從0開始的打Pwn教學30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言