在這支程式比較會有疑問的地方應該是puts和printf的前置作業差別,puts只需要有個字串就可以輸出了,而printf需要字串和我們在printf Function雙引號內打的內容。
不懂就問man,可以看到在puts的定義,參數的部分就吃要print的內容就好,很單純。
而printf,除了吃字串以外,還要吃一個指定的格式,也就是我們所輸入的%s。
這也可以得知由於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。
同理,如果Call A Function是傳送Float格式也會有不一樣的變化,這邊的小程式會送一個Float格式給A Function,可以看到在Call A之前的作業不是將EAX設為0了,未來在做Reverse的時候會遇到更多的Calling conventions問題。