2010-04-27 2 views
3

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

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

EDIT:

Эта программа работает на Windows XP SP3 32b, написанный на C++, Intel ASM

есть "Hack" код

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 

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

+0

Ничего себе. Хотелось бы, чтобы у нас были такие домашние задания. – sharptooth

+1

Вам необходимо опубликовать свой код, если вы хотите, чтобы люди здесь, на SO, чтобы помочь вам отладить его. –

+0

@Paul R: код прост, для вызова этой функции я использую 3 команды: 2x PUSH a 1x CALL. Другие значения (регистры и остальная часть стека) не определены, это может быть что угодно. Значения PUSHes и CALL - это только адреса, зависящие от программы, но они правильные, что я проверил много раз. Я думаю, что проблема в некоторой неопределенной ценности, которую я забыл установить, например, в каком-то регистре и т. Д. – Gaim

ответ

0

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

1

Вы, эти параметры для 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

Нет, я не пытаюсь разобрать текст. Этот хак является частью стека (ошибка переполнения буфера), где я сохранил свои «данные». Этот текст записывается в память после того, как я отправил свой hackcode, и из-за этого есть прыжок в 0012F9BF. – Gaim

+1

Итак, зачем вручную комментировать его с помощью команды «I/O» и т. Д. ...? Для меня это явно предполагает исполняемый код, а не данные, что, очевидно, не так. –

+0

Это не моя аннотация. Эта программа была скомпилирована с -g, поэтому есть отладочная информация. этот hackcode абсолютно без комментариев от меня, те, которые дают смысл, пишутся только здесь, потому что чтение и часть данных, которые вы упомянули, написаны программой несколькими инструкциями, последними после моего hackcode. – Gaim

Смежные вопросы