Assembly 汇编程序中的Printf不';t打印 我有一个作业用缓冲区溢出(用DASSAMBLE,程序用C++编写,我没有源码)来破解程序。我已经做到了,但我有一个问题。我必须在屏幕上打印一些消息,所以我找到了printf函数的地址,按“HACKED”的地址和堆栈上“%s”的地址(按此顺序)调用了该函数。调用的代码通过得很好,但没有打印任何内容

Assembly 汇编程序中的Printf不';t打印 我有一个作业用缓冲区溢出(用DASSAMBLE,程序用C++编写,我没有源码)来破解程序。我已经做到了,但我有一个问题。我必须在屏幕上打印一些消息,所以我找到了printf函数的地址,按“HACKED”的地址和堆栈上“%s”的地址(按此顺序)调用了该函数。调用的代码通过得很好,但没有打印任何内容,assembly,x86,buffer-overflow,disassembly,Assembly,X86,Buffer Overflow,Disassembly,我试着模拟程序中其他地方的环境,但肯定有问题。你知道我做错了什么吗?我没有输出?非常感谢 编辑: 本程序运行在Windows XP SP332 B上,用C++编写,英特尔ASM 这里有“黑客”代码 课程开始: CPU Disasm Address Hex dump Command Comments 00403F40 /$ 55 PUSH EBP 00403F41 |. 8BEC

我试着模拟程序中其他地方的环境,但肯定有问题。你知道我做错了什么吗?我没有输出?非常感谢

编辑:

本程序运行在Windows XP SP332 B上,用C++编写,英特尔ASM

这里有“黑客”代码

课程开始:

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的参数是按正确的顺序传递的,它们的数量是正确的,并且它们都是通过堆栈传递的(优化可能意味着使用寄存器)。可变数量的参数可能会导致比您假设的更复杂的参数列表。也许可以尝试调用puts,这可能更简单

编辑:刚刚看到您的编辑,您正试图分解一堆永远不会执行的文本;代码以

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 

实际上只是一段文字,上面写着“长度是494,前1行”。我发现这是因为printf不应该有输入和输出。提示:当破解和反汇编代码时,请始终在显示ASCII和UNICODE的编辑器中并排查看代码,以根除文本文字。

我没有发现错误,但我已更改了破解代码的结构,现在它正在工作。我只发布了一些指令,这些指令将EIP从堆栈重定向到堆中,在那里我有“无限”的空间,在这里我可以执行所需的代码。谢谢你的建议

哇。我希望我们有这样的家庭作业。如果你想让这里的人帮你调试代码,你就需要发布代码。@Gaim:看不到代码,这只是毫无意义的推测-你为什么不能发布源代码?为什么不用调试器跟踪printf调用?@Gaim:你真的需要采取行动在这里编写代码,将其作为ASM源代码的一部分进行编辑,并使用标签显示执行跳转和文字数据的位置。正如我在下面的回答中所解释的,上面的分解是错误的。就我个人而言,在汇编程序中,我也倾向于注释大多数行,并指出如何在调用入口点传递参数。可能是因为过去发生过太多不可原谅的车祸;)不,我不是在试图分解文字。这是我保存“数据”的堆栈(缓冲区溢出错误)的一部分。在我发送我的hackcode后,该文本被写入内存,因此在0012F9BF处有跳转。那么为什么要用“I/O命令”等手动注释它呢。。。?对我来说,这显然意味着可执行代码而不是数据,这显然不是事实。这不是我的注释。这个程序是用-g编译的,所以有调试信息。这段黑客代码完全没有我的评论,这些给人一种感觉的只是在这里写的,因为你提到的部分数据是在我的黑客代码之后由程序编写的。
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