Значение EIP сборки x86 не отображается в читаемом формате - PullRequest
0 голосов
/ 09 мая 2019

У меня есть фрагмент кода сборки, который я анализирую для извлечения секретного ключа. Исходный код приведен ниже, но я делаю установку точки останова после инструкции pop esp, а затем пытаюсь проверить стек для определения 128-битного ключа.

Мои знания по сборке все еще элементарны, но я думаю, что происходит то, что программа создает ключ с помощью серии открывающих инструкций DWORD и затем загружает его в стек.

Проблема в выходе. Я ломаюсь после вызова pop esp, проверяю стек, но все «зашифровано».

Я думаю, что это строка, которую я хочу: 0xffffd21c ("#'%px$rr 'q#rq' r\"u$w%vsp\"p\"y#$v' twy#q$yt'p'x$psu \"ww' y'v' srr$#xtvqt$s \"uyt\"pxptuwsr'stry\"v'\"rrw\"ptpwvy''y 'x\"y wrys\"rqq\"uyvv")

У меня вопрос: правильно ли я понимаю исполнение и почему? Как я могу исправить свой процесс, чтобы извлечь читаемую человеком строку из искаженных символов в esp?

Мой вывод из GDB / PEDA ...

root@kali:~/ctp/challenge# gdb ./key 
GNU gdb (GDB) 8.2
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-pc-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./key...done.
gdb-peda$ break *0x565560a4
Breakpoint 1 at 0x565560a4
gdb-peda$ r
Starting program: /root/ctp/challenge/key 



[----------------------------------registers-----------------------------------]
EAX: 0x0 
EBX: 0xf7ffd000 --> 0x28f2c 
ECX: 0x0 
EDX: 0xf7fe4560 (push   ebp)
ESI: 0xffffd2ac --> 0xffffd468 ("SHELL=/bin/bash")
EDI: 0x56556000 (<_start>:  xor    eax,eax)
EBP: 0x0 
ESP: 0xffffd218 --> 0xffffd21c ("#'%px$rr 'q#rq' r\"u$w%vsp\"p\"y#$v' twy#q$yt'p'x$psu \"ww' y'v' srr$#xtvqt$s \"uyt\"pxptuwsr'stry\"v'\"rrw\"ptpwvy''y 'x\"y wrys\"rqq\"uyvv")
EIP: 0x565560a4 (<_start+164>:  pop    esi)
EFLAGS: 0x246 (carry PARITY adjust ZERO sign trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
   0x56556099 <_start+153>: push   0x72722478
   0x5655609e <_start+158>: push   0x70252723
   0x565560a3 <_start+163>: push   esp
=> 0x565560a4 <_start+164>: pop    esi
   0x565560a5 <_start+165>: mov    edi,esi
   0x565560a7 <_start+167>: mov    edx,edi
   0x565560a9 <_start+169>: cld    
   0x565560aa <_start+170>: mov    ecx,0x80
[------------------------------------stack-------------------------------------]
0000| 0xffffd218 --> 0xffffd21c ("#'%px$rr 'q#rq' r\"u$w%vsp\"p\"y#$v' twy#q$yt'p'x$psu \"ww' y'v' srr$#xtvqt$s \"uyt\"pxptuwsr'stry\"v'\"rrw\"ptpwvy''y 'x\"y wrys\"rqq\"uyvv")
0004| 0xffffd21c ("#'%px$rr 'q#rq' r\"u$w%vsp\"p\"y#$v' twy#q$yt'p'x$psu \"ww' y'v' srr$#xtvqt$s \"uyt\"pxptuwsr'stry\"v'\"rrw\"ptpwvy''y 'x\"y wrys\"rqq\"uyvv")
0008| 0xffffd220 ("x$rr 'q#rq' r\"u$w%vsp\"p\"y#$v' twy#q$yt'p'x$psu \"ww' y'v' srr$#xtvqt$s \"uyt\"pxptuwsr'stry\"v'\"rrw\"ptpwvy''y 'x\"y wrys\"rqq\"uyvv")
0012| 0xffffd224 (" 'q#rq' r\"u$w%vsp\"p\"y#$v' twy#q$yt'p'x$psu \"ww' y'v' srr$#xtvqt$s \"uyt\"pxptuwsr'stry\"v'\"rrw\"ptpwvy''y 'x\"y wrys\"rqq\"uyvv")
0016| 0xffffd228 ("rq' r\"u$w%vsp\"p\"y#$v' twy#q$yt'p'x$psu \"ww' y'v' srr$#xtvqt$s \"uyt\"pxptuwsr'stry\"v'\"rrw\"ptpwvy''y 'x\"y wrys\"rqq\"uyvv")
0020| 0xffffd22c ("r\"u$w%vsp\"p\"y#$v' twy#q$yt'p'x$psu \"ww' y'v' srr$#xtvqt$s \"uyt\"pxptuwsr'stry\"v'\"rrw\"ptpwvy''y 'x\"y wrys\"rqq\"uyvv")
0024| 0xffffd230 ("w%vsp\"p\"y#$v' twy#q$yt'p'x$psu \"ww' y'v' srr$#xtvqt$s \"uyt\"pxptuwsr'stry\"v'\"rrw\"ptpwvy''y 'x\"y wrys\"rqq\"uyvv")
0028| 0xffffd234 ("p\"p\"y#$v' twy#q$yt'p'x$psu \"ww' y'v' srr$#xtvqt$s \"uyt\"pxptuwsr'stry\"v'\"rrw\"ptpwvy''y 'x\"y wrys\"rqq\"uyvv")
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value

Breakpoint 1, 0x565560a4 in _start ()
gdb-peda$ x/10s $esp
0xffffd218: "\034\322\377\377#'%px$rr 'q#rq' r\"u$w%vsp\"p\"y#$v' twy#q$yt'p'x$psu \"ww' y'v' srr$#xtvqt$s \"uyt\"pxptuwsr'stry\"v'\"rrw\"ptpwvy''y 'x\"y wrys\"rqq\"uyvv"
0xffffd29d: ""
0xffffd29e: ""
0xffffd29f: ""
0xffffd2a0: "\001"
0xffffd2a2: ""
0xffffd2a3: ""
0xffffd2a4: "P\324\377\377"
0xffffd2a9: ""
0xffffd2aa: ""
gdb-peda$ 

Код ...

global _start
_start:
    xor eax,eax
    push eax
    push dword 0x76767975
    push dword 0x22717172
    push dword 0x22737972
    push dword 0x77207922
    push dword 0x78272079
    push dword 0x27277976
    push dword 0x77707470
    push dword 0x22777272
    push dword 0x22277622
    push dword 0x79727473
    push dword 0x27727377
    push dword 0x75747078
    push dword 0x70227479
    push dword 0x75222073
    push dword 0x24747176
    push dword 0x74782324
    push dword 0x72727320
    push dword 0x27762779
    push dword 0x20277777
    push dword 0x22207573
    push dword 0x70247827
    push dword 0x70277479
    push dword 0x24712379
    push dword 0x77742027
    push dword 0x76242379
    push dword 0x22702270
    push dword 0x73762577
    push dword 0x24752272
    push dword 0x20277172
    push dword 0x23712720
    push dword 0x72722478
    push dword 0x70252723
    push esp
    pop esi
    mov edi,esi
    mov edx,edi
    cld
    mov ecx,0x80
    mov ebx,0x41
    xor eax,eax
    push eax
    lodsb
    xor eax,ebx
    stosb
    ;loop 0xb7 ; offending line
    ;dec ecx
    jnz 0xb7; added in
    push esp
    pop esi
    int3
    db 0x0a

1 Ответ

0 голосов
/ 09 мая 2019

Они не искажены, это (предположительно) правильная интерпретация этих байтов как символов ASCII.

И они не являются значениями EIP или значениями .(«Значение EIP» иногда используется для адреса возврата, даже если в EIP они не , но я не думаю, что это происходит здесь).Фактическое отображение EIP в порядке: EIP: 0x565560a4 (<_start+164>: pop esi).

Если бы в стеке были адреса возврата, вы бы использовали x /10xw $esp или аналогичный.

Это похоже на строковые данные.например, 0x70 ^ 0x41 = 0x31 = '1'0x23^0x41 = 0x62 = 'b'.

Но я думаю, что происходит то, что программа создает ключ с помощью серии открывающих инструкций DWORD и затем загружает его в стек.

Нет, он создает данные в стеке с серией нажатий.Это уже в стеке в этой точке.

Ключ 0x41, в mov ebx, 0x41.


Тогда этоПохоже, он имеет неэффективный цикл, который должен xor каждый байт по одному с 0x41, но вы закомментировали dec и оставили в ветке абсолютный адрес 0xb7, что приведет к segfault под Linux.

Совершенно очевидно, что это должно быть

.loop:            ; do {
   lodsb
   xor  eax,ebx
   stosb
   dec  ecx
   jnz  .loop     ; }while(--ecx);

после более ранних инструкций, которые настраивают EDI и ESI = ESP, и очищают инструкции DF to string, идущие вверх.

Thisзабавно неэффективен (идет по 1 байту за раз для ECX = 0x80 байтов и использует медленную инструкцию loop, которая ограничивает ее до 1 итерации на 6 циклов на последних процессорах Intel), но также не выглядит оптимизированной для размера кода.(mov eax, 0x41 - 5 байтов против 3 для push 0x41 / pop eax).Оптимизация цикла для размера кода, но код за пределами для скорости обратный.

Гораздо эффективнее было бы xor dword [esi], 0x41414141 / add esi,4.(Или вы можете использовать lodsd как 1-байтовый способ увеличить ESI на 4, если вам важен размер кода, а не скорость.)

...