вторник, 23 сентября 2014 г.

О том, что осталось за кадром

В жизни каждого "правильного" исследователя всегда есть момент, когда ты берешься за что-то, что вероятно тебе нахрен не нужно практически, но крайне интересно с образовательной точки зрения. Интересно решать задачи для расширения кругозора и повышения собственной квалификации, особенно при наличии придурковатого состояния одержимости какой-то фантастической идеей. В моем случае одной из главных одержимостей в 2002 году было желание сделать то, чего еще не существовало, а если и существовало, то работало не так как я хотел, и конечно же было сделано не мной (damn it). Эта же одержимость сподвигла на создание интерцептера, но данный пост о совсем другом проекте. В то время я желал освоить ассемблер, т.к. это язык настоящих гуру и на тот момент идея о том, что настоящий хакер должен знать ассемблер, сидела в моем сознании довольно глубоко. Слепая замена jz на jnz,
сидя в softice конечно давала некие результаты на простых приложеинях, но хотелось большего. Ничего лучше, чем написание собственного дизассемблера, с целью разобраться в этой компьютерной магии, я не придумал. Опять же, дизассемблер дизассемблеру рознь. Простой листинг инструкций меня не устраивал, я хотел получить на выходе исходник, который можно было бы тут же собрать и получить рабочий бинарник, идентичный оригинальному. Не буду вдаваться в такие специфичные проблемы как отделение данных от кода и т.д., а просто покажу что в итоге получилось.



Демо 1 - дизасссемблирование моего же порт-сканера на асме. Все символы (имена переменных и подфункций) присутствуют в эльфе.

/*
 *|--------------------------------------
 *| 0x4553_Reconstructor
 *| ELF format detected
 *| Start disassembling of [test]
 *| Entry point is.........[8048074]
 *| .text segment size.....[564]
 *| .data segment size.....[0]
 *| .data segment addr.....[80492a8]
 *| .symtab found
 *| .strtab found
 *|--------------------------------------
 */

/* Reading constants values...(if presents)   */
STDOUT=1
AF_INET=2
SOCK_STREAM=1
IPPROTO_IP=0
NULL=0
SYS_exit=1
SYS_read=3
SYS_write=4
SYS_socketcall=102
SYS_socket=1
SYS_connect=3
sys=128
SIZEOF_SA=16
SIN_FAMILY=-16
SIN_PORT=-14
SIN_ADDR=-12
SIN_ZERO0=-8
SIN_ZERO1=-4
SA=-16
ARGS=-32
SOCK=-32
ARG0=-32
ARG1=-28
ARG2=-24
ARG3=-20
SOCK_BUF=-544
PORT=1
END_PORT=100
X=-16
counter=-20
uselen=31
__bss_start=134517416
_edata=134517416
_end=134517440

/* Reading objects ...(if presents)   */

/* 80492a8: */ .bss   /*section*/
/* 80492a8: */ .lcomm ip_addr,16
/* 80492b8: */ .lcomm this_digit,4
/* 80492bc: */ .lcomm ip_number,4

/* 8048074: */ .text   /*section*/
.globl _start

/* 8048074: */ _start:
/* 8048074: 5b */ pop      %ebx
/* 8048075: 83 fb 01 */ cmp      $0x1,%ebx
/* 8048078: 0f 84 aa 01 00 00 */ jz       usage
/* 804807e: 5b */ pop      %ebx
/* 804807f: 5b */ pop      %ebx
/* 8048080: 85 db */ test     %ebx,%ebx
/* 8048082: 0f 84 a3 00 00 00 */ jz       done_cmd
/* 8048088: 8a 03 */ movb     (%ebx),%al
/* 804808a: 43 */ inc      %ebx
/* 804808b: 3c 2d */ cmp      $0x2d,%al
/* 804808d: 0f 85 95 01 00 00 */ jnz      usage
/* 8048093: 8a 03 */ movb     (%ebx),%al
/* 8048095: 3c 74 */ cmp      $0x74,%al
/* 8048097: 0f 85 8b 01 00 00 */ jnz      usage
/* 804809d: 43 */ inc      %ebx
/* 804809e: 43 */ inc      %ebx
/* 804809f: 8d 3d a8 92 04 08 */ leal     ip_addr,%edi
/* 80480a5: b0 2e */ movb $0x2e,%al
/* 80480a7: aa */ stosb

/* 80480a8: */ nextchar:
/* 80480a8: 8a 03 */ movb     (%ebx),%al
/* 80480aa: aa */ stosb
/* 80480ab: 84 c0 */ test     %al,%al
/* 80480ad: 74 03 */ jz       breakchar
/* 80480af: 43 */ inc      %ebx
/* 80480b0: e2 f6 */ loop     nextchar

/* 80480b2: */ breakchar:
/* 80480b2: 4f */ dec      %edi
/* 80480b3: 4f */ dec      %edi
/* 80480b4: 89 fe */ mov     %edi,%esi
/* 80480b6: b9 04 00 00 00 */ mov      $SYS_write,%ecx
/* 80480bb: c7 05 bc 92 04 08 00 00 00 00 */movl     $0x0000,ip_number
/* 80480c5: fd */ std

/* 80480c6: */ next_ip_byte:
/* 80480c6: c7 05 b8 92 04 08 00 00 00 00 */movl     $0x0000,this_digit
/* 80480d0: ac */ lodsb
/* 80480d1: 3c 2e */ cmp      $0x2e,%al
/* 80480d3: 75 01 */ jnz      not_dot
/* 80480d5: ac */ lodsb

/* 80480d6: */ not_dot:
/* 80480d6: 2c 30 */ sub      $0x30,%al
/* 80480d8: 00 05 b8 92 04 08 */ add      %al, this_digit
/* 80480de: ac */ lodsb
/* 80480df: 3c 2e */ cmp      $0x2e,%al
/* 80480e1: 74 2f */ jz       dot
/* 80480e3: 2c 30 */ sub      $0x30,%al
/* 80480e5: 89 c2 */ mov     %eax,%edx
/* 80480e7: d1 e0 */ shl      $1,%eax
/* 80480e9: c1 e2 03 */ shl      $0x3,%edx
/* 80480ec: 00 d0 */ add      %dl,%al
/* 80480ee: 00 05 b8 92 04 08 */ add      %al, this_digit
/* 80480f4: ac */ lodsb
/* 80480f5: 3c 2e */ cmp      $0x2e,%al
/* 80480f7: 74 19 */ jz       dot
/* 80480f9: 2c 30 */ sub      $0x30,%al
/* 80480fb: 89 c3 */ mov     %eax,%ebx
/* 80480fd: 89 c2 */ mov     %eax,%edx
/* 80480ff: c1 e0 02 */ shl      $0x2,%eax
/* 8048102: c1 e3 05 */ shl      $0x5,%ebx
/* 8048105: c1 e2 06 */ shl      $0x6,%edx
/* 8048108: 00 d8 */ add      %bl,%al
/* 804810a: 00 d0 */ add      %dl,%al
/* 804810c: 00 05 b8 92 04 08 */ add      %al, this_digit

/* 8048112: */ dot:
/* 8048112: 89 c8 */ mov     %ecx,%eax
/* 8048114: 49 */ dec      %ecx
/* 8048115: c1 e1 03 */ shl      $0x3,%ecx
/* 8048118: 8b 15 b8 92 04 08 */ mov      this_digit, %edx
/* 804811e: d3 e2 */ shl      %cl,%edx
/* 8048120: 01 15 bc 92 04 08 */ add      %edx, ip_number
/* 8048126: 89 c1 */ mov     %eax,%ecx
/* 8048128: e2 9c */ loop     next_ip_byte
/* 804812a: fc */ cld

/* 804812b: */ done_cmd:
/* 804812b: 55 */ push     %ebp
/* 804812c: 89 e5 */ mov     %esp,%ebp
/* 804812e: bf 01 00 00 00 */ mov      $STDOUT,%edi

/* 8048133: */ loop:
/* 8048133: 89 f8 */ mov     %edi,%eax
/* 8048135: 66 c1 c0 08 */ rol      $0x8,%ax
/* 8048139: c7 45 f0 02 00 00 00 */ movl     $0x00000002,0xfffffff0(%ebp)
/* 8048140: 89 45 f2 */ movl     %eax,0xfffffff2(%ebp)
/* 8048143: a1 bc 92 04 08 */ mov      ip_number,%eax
/* 8048148: 89 45 f4 */ movl     %eax,0xfffffff4(%ebp)
/* 804814b: c7 45 f8 00 00 00 00 */ movl     $0x00000000,0xfffffff8(%ebp)
/* 8048152: c7 45 fc 00 00 00 00 */ movl     $0x00000000,0xfffffffc(%ebp)
/* 8048159: b8 66 00 00 00 */ mov      $SYS_socketcall,%eax
/* 804815e: bb 01 00 00 00 */ mov      $STDOUT,%ebx
/* 8048163: c7 45 e0 02 00 00 00 */ movl     $0x00000002,0xffffffe0(%ebp)
/* 804816a: c7 45 e4 01 00 00 00 */ movl     $0x00000001,0xffffffe4(%ebp)
/* 8048171: c7 45 e8 00 00 00 00 */ movl     $0x00000000,0xffffffe8(%ebp)
/* 8048178: 8d 4d e0 */ leal     0xffffffe0(%ebp),%ecx
/* 804817b: cd 80 */ int      $0x80
/* 804817d: 83 f8 00 */ cmp      $0x0,%eax
/* 8048180: 0f 8c b1 00 00 00 */ jl       exit
/* 8048186: 89 45 e0 */ movl     %eax,0xffffffe0(%ebp)
/* 8048189: 40 */ inc      %eax
/* 804818a: b8 66 00 00 00 */ mov      $SYS_socketcall,%eax
/* 804818f: bb 03 00 00 00 */ mov      $SYS_read,%ebx
/* 8048194: 8d 55 f0 */ leal     0xfffffff0(%ebp),%edx
/* 8048197: 89 55 e4 */ movl     %edx,0xffffffe4(%ebp)
/* 804819a: c7 45 e8 10 00 00 00 */ movl     $0x00000010,0xffffffe8(%ebp)
/* 80481a1: 8d 4d e0 */ leal     0xffffffe0(%ebp),%ecx
/* 80481a4: cd 80 */ int      $0x80
/* 80481a6: 83 f8 00 */ cmp      $0x0,%eax
/* 80481a9: 7c 59 */ jl       next
/* 80481ab: b9 75 82 04 08 */ mov      $str,%ecx
/* 80481b0: ba 06 00 00 00 */ mov      $0x00000006, %edx
/* 80481b5: e8 63 00 00 00 */ call     pr_sock
/* 80481ba: b8 03 00 00 00 */ mov      $SYS_read,%eax
/* 80481bf: 8b 5d e0 */ movl     0xffffffe0(%ebp),%ebx
/* 80481c2: 8d 8d e0 fd ff ff */ leal     0xfffffde0(%ebp),%ecx
/* 80481c8: ba 32 00 00 00 */ mov      $0x00000032, %edx
/* 80481cd: cd 80 */ int      $0x80
/* 80481cf: 89 f8 */ mov     %edi,%eax
/* 80481d1: e8 68 00 00 00 */ call     int2ascii

/* 80481d6: */ return:
/* 80481d6: b9 7c 82 04 08 */ mov      $open,%ecx
/* 80481db: ba 09 00 00 00 */ mov      $0x00000009, %edx
/* 80481e0: e8 2b 00 00 00 */ call     pr_std
/* 80481e5: 8d 8d e0 fd ff ff */ leal     0xfffffde0(%ebp),%ecx
/* 80481eb: ba 1e 00 00 00 */ mov      $0x0000001e, %edx
/* 80481f0: e8 1b 00 00 00 */ call     pr_std
/* 80481f5: b9 a5 82 04 08 */ mov      $cr,%ecx
/* 80481fa: ba 02 00 00 00 */ mov      $AF_INET,%edx
/* 80481ff: e8 0c 00 00 00 */ call     pr_std

/* 8048204: */ next:
/* 8048204: 47 */ inc      %edi
/* 8048205: 89 f8 */ mov     %edi,%eax
/* 8048207: 3c 65 */ cmp      $0x65,%al
/* 8048209: 74 2c */ jz       exit
/* 804820b: e9 23 ff ff ff */ jmp      loop

/* 8048210: */ pr_std:
/* 8048210: b8 04 00 00 00 */ mov      $SYS_write,%eax
/* 8048215: bb 01 00 00 00 */ mov      $STDOUT,%ebx
/* 804821a: cd 80 */ int      $0x80
/* 804821c: c3 */ ret

/* 804821d: */ pr_sock:
/* 804821d: b8 04 00 00 00 */ mov      $SYS_write,%eax
/* 8048222: 8b 5d e0 */ movl     0xffffffe0(%ebp),%ebx
/* 8048225: cd 80 */ int      $0x80
/* 8048227: c3 */ ret

/* 8048228: */ usage:
/* 8048228: b9 86 82 04 08 */ mov      $use,%ecx
/* 804822d: ba 1f 00 00 00 */ mov      $uselen,%edx
/* 8048232: e8 d9 ff ff ff */ call     pr_std

/* 8048237: */ exit:
/* 8048237: b8 01 00 00 00 */ mov      $STDOUT,%eax
/* 804823c: cd 80 */ int      $0x80

/* 804823e: */ int2ascii:
/* 804823e: 31 f6 */ xor      %esi,%esi

/* 8048240: */ loop1:
/* 8048240: ba 00 00 00 00 */ mov      $0x00000000, %edx
/* 8048245: bb 0a 00 00 00 */ mov      $0x0000000a, %ebx
/* 804824a: f7 f3 */ div      %ebx
/* 804824c: 80 c2 30 */ add      $0x30,%dl
/* 804824f: 52 */ push     %edx
/* 8048250: 46 */ inc      %esi
/* 8048251: 3c 00 */ cmp      $0x0,%al
/* 8048253: 74 02 */ jz       print
/* 8048255: eb e9 */ jmp      loop1

/* 8048257: */ print:
/* 8048257: 8f 01 */ popl     (%ecx)
/* 8048259: 85 f6 */ test     %esi,%esi
/* 804825b: 0f 84 75 ff ff ff */ jz       return
/* 8048261: 4e */ dec      %esi
/* 8048262: b8 04 00 00 00 */ mov      $SYS_write,%eax
/* 8048267: bb 01 00 00 00 */ mov      $STDOUT,%ebx
/* 804826c: ba 02 00 00 00 */ mov      $AF_INET,%edx
/* 8048271: cd 80 */ int      $0x80
/* 8048273: eb e2 */ jmp      print

/* 8048275: */ str:
/* 8048275: data at .text  detected! */
/* 8048275: */ .string "test\r\n"

/* 804827c: */ open:
/* 804827c: data at .text  detected! */
/* 804827c: */ .string " is open:"

/* 8048286: */ use:
/* 8048286: data at .text  detected! */
/* 8048286: */ .string "./0x4553_asm_portscan -t <ip>\n"

/* 80482a5: */ cr:
/* 80482a5: data at .text  detected! */
/* 80482a5: */ .string "\n"


Демо 2 - тестовое приложение на Си с зачисткой символов через strip. Как видите имена переменных, при их отсутствии,  задаются автоматически.

$cat lol.c
int main()
{

write(1,"hello ",6);
printf("fucking ");
puts("world");
exit(0);

}

$gcc lol.c -o lol
$strip lol
$./0x4553_Reconstructor lol -C

/*|--------------------------------------
 *| 0x4553_Reconstructor
 *| ELF format.............[detected]
 *| Start disassembling of.[lol]
 *| Entry point is.........[80483b0]
 *| .text segment size.....[352]
 *| .rodata section size...[30]
 *| .rodata section addr...[804852c]
 *| label mode.............[on]
 *| .rel.plt...............[found]
 *| .dynstr................[found]
 *| string mode............[on]
 *| binarie comlied with...[gcc]
 *|--------------------------------------
 */

/* 80483b0: */ .text   /*segment*/
.globl main
/* main() function found at 0x8048490 */
main:
/* 8048490: 55 */ push     %ebp
/* 8048491: 89 e5 */ mov      %esp,%ebp
/* 8048493: 83 ec 08 */ sub      $0x8,%esp
/* 8048496: 83 c4 fc */ add      $0xfc,%esp
/* 8048499: 6a 06 */ push     $0x6
/* 804849b: 68 34 85 04 08 */ push     $String0 /* pointing to .rodata */
/* 80484a0: 6a 01 */ push     $0x1
/* 80484a2: e8 a5 fe ff ff */ call     write /*0x804834c*/
/* 80484a7: 83 c4 10 */ add      $0x10,%esp
/* 80484aa: 83 c4 f4 */ add      $0xf4,%esp
/* 80484ad: 68 3b 85 04 08 */ push     $String1 /* pointing to .rodata */
/* 80484b2: e8 d5 fe ff ff */ call     printf /*0x804838c*/
/* 80484b7: 83 c4 10 */ add      $0x10,%esp
/* 80484ba: 83 c4 f4 */ add      $0xf4,%esp
/* 80484bd: 68 44 85 04 08 */ push     $String2 /* pointing to .rodata */
/* 80484c2: e8 95 fe ff ff */ call     puts /*0x804835c*/
/* 80484c7: 83 c4 10 */ add      $0x10,%esp
/* 80484ca: 83 c4 f4 */ add      $0xf4,%esp
/* 80484cd: 6a 00 */ push     $0x0
/* 80484cf: e8 c8 fe ff ff */ call     exit /*0x804839c*/
/* 80484d4: 83 c4 10 */ add      $0x10,%esp
/* 80484d7: c9 */ leave
/* 80484d8: c3 */ ret


/* 804852c: */ .section .rodata   
/* 804852c: */ .string ""
/* 804852e: */ .string ""
/* 804852f: */ .string ""
/* 8048530: */ .string ""
/* 8048532: */ .string ""

/* 8048534: */ String0:
/* 8048534: */ .string "hello "

/* 804853b: */ String1:
/* 804853b: */ .string "fucking "

/* 8048544: */ String2:
/* 8048544: */ .string "world"


Демо 3 - дизасм реального приложения /bin/true. Генерируются подфункции, на выходе готовый и рабочий сорц.

bash-2.05a# ls -la /bin/true
-rwxr-xr-x    1 root     bin          4720 Feb 19  2002 /bin/true

bash-2.05a# ltrace /bin/true
__libc_start_main(0x08048678, 1, 0xbffff794, 0x0804843c, 0x080487ec <unfinished ...>
__register_frame_info(0x08049aec, 0x08049c10, 0xbffff738, 0x4004bcab, 0x4013ce58) = 0x08049c10
setlocale(6, "")                                  = "C"
bindtextdomain("sh-utils", "/usr/share/locale")   = "/usr/share/locale"
textdomain("sh-utils")                            = "sh-utils"
exit(0 <unfinished ...>
__deregister_frame_info(0x08049aec, 0x40009c7a, 0x40014a7c, 0x40142020, 1) = 0
+++ exited (status 0) +++

bash-2.05a# ./0x4553_Reconstructor -C /bin/true > true.s
bash-2.05a# cat true.s
/*|--------------------------------------
 *| 0x4553_Reconstructor
 *| ELF format.............[detected]
 *| Start disassembling of.[/bin/true]
 *| Entry point is.........[8048550]
 *| .text segment size.....[668]
 *| .rodata segment size...[704]
 *| .rodata segment addr...[8048820]
 *| label mode.............[on]
 *| .rel.plt...............[found]
 *| .dynstr................[found]
 *| string mode............[on]
 *| binarie comlied with...[gcc]
 *|--------------------------------------
 */

/* 8048550: */ .text   /*segment*/
.globl main
/* main() function found at 0x8048678 */
/* main() size - 316 */
main:
/* 8048678: 55 */ push     %ebp
/* 8048679: 89 e5 */ mov      %esp,%ebp
/* 804867b: 83 ec 0c */ sub      $0xc,%esp
/* 804867e: 57 */ push     %edi
/* 804867f: 56 */ push     %esi
/* 8048680: 53 */ push     %ebx
/* 8048681: 8b 5d 08 */ movl     0x8(%ebp),%ebx
/* 8048684: 8b 55 0c */ movl     0xc(%ebp),%edx
/* 8048687: 8b 02 */ movl     (%edx),%eax
/* 8048689: a3 28 9c 04 08 */ mov      %eax, Object0 /* pointing to .bss */
/* 804868e: 83 c4 f8 */ add      $0xfffffff8,%esp
/* 8048691: 68 68 89 04 08 */ push     $P_String0 /* pointing to .rodata */
/* 8048696: 6a 06 */ push     $0x6
/* 8048698: e8 17 fe ff ff */ call     setlocale /*0x80484b4*/
/* 804869d: 83 c4 f8 */ add      $0xfffffff8,%esp
/* 80486a0: 68 69 89 04 08 */ push     $P_String1 /* pointing to .rodata */
/* 80486a5: 68 7b 89 04 08 */ push     $P_String2 /* pointing to .rodata */
/* 80486aa: e8 35 fe ff ff */ call     bindtextdomain /*0x80484e4*/
/* 80486af: 83 c4 20 */ add      $0x20,%esp
/* 80486b2: 83 c4 f4 */ add      $0xfffffff4,%esp
/* 80486b5: 68 7b 89 04 08 */ push     $P_String2 /* pointing to .rodata */
/* 80486ba: e8 55 fe ff ff */ call     textdomain /*0x8048514*/
/* 80486bf: 83 c4 10 */ add      $0x10,%esp
/* 80486c2: 83 fb 02 */ cmp      $0x2,%ebx
/* 80486c5: 75 74 */ jnz      Label3 /*0x804873b*/
/* 80486c7: 83 c4 f4 */ add      $0xfffffff4,%esp
/* 80486ca: 68 84 89 04 08 */ push     $P_String4 /* pointing to .rodata */
/* 80486cf: e8 c0 fd ff ff */ call     getenv /*0x8048494*/
/* 80486d4: 83 c4 10 */ add      $0x10,%esp
/* 80486d7: 85 c0 */ test     %eax,%eax
/* 80486d9: 75 60 */ jnz      Label3 /*0x804873b*/
/* 80486db: 8b 45 0c */ movl     0xc(%ebp),%eax
/* 80486de: 8b 70 04 */ movl     0x4(%eax),%esi
/* 80486e1: bf 94 89 04 08 */ mov      $M_String0, %edi
/* 80486e6: b9 07 00 00 00 */ mov      $0x7, %ecx
/* 80486eb: fc */ cld
/* 80486ec: a8 00 */ test     $0x0,%al
/* 80486ee: f3 */ repz
/* 80486ef: a6 */ cmpsb
/* 80486f0: 75 0d */ jnz      Label6 /*0x80486ff*/
/* 80486f2: 83 c4 f4 */ add      $0xfffffff4,%esp
/* 80486f5: 6a 00 */ push     $0x0
/* 80486f7: e8 28 ff ff ff */ call     Label7 /*0x8048624*/
/* 80486fc: 83 c4 10 */ add      $0x10,%esp

/* 80486ff: */ Label6:
/* 80486ff: 8b 55 0c */ movl     0xc(%ebp),%edx
/* 8048702: 8b 72 04 */ movl     0x4(%edx),%esi
/* 8048705: bf 9b 89 04 08 */ mov      $M_String1, %edi
/* 804870a: b9 0a 00 00 00 */ mov      $0xa, %ecx
/* 804870f: fc */ cld
/* 8048710: a8 00 */ test     $0x0,%al
/* 8048712: f3 */ repz
/* 8048713: a6 */ cmpsb
/* 8048714: 75 25 */ jnz      Label3 /*0x804873b*/
/* 8048716: 83 c4 f4 */ add      $0xfffffff4,%esp
/* 8048719: 68 a5 89 04 08 */ push     $P_String5 /* pointing to .rodata */
/* 804871e: 68 ac 89 04 08 */ push     $P_String6 /* pointing to .rodata */
/* 8048723: 68 b0 89 04 08 */ push     $P_String7 /* pointing to .rodata */
/* 8048728: 68 bd 89 04 08 */ push     $P_String8 /* pointing to .rodata */
/* 804872d: ff 35 0c 9c 04 08 */ incl     0x08049c0c
/* 8048733: e8 10 00 00 00 */ call     Label9 /*0x8048748*/
/* 8048738: 83 c4 20 */ add      $0x20,%esp

/* 804873b: */ Label3:
/* 804873b: 83 c4 f4 */ add      $0xfffffff4,%esp
/* 804873e: 6a 00 */ push     $0x0
/* 8048740: e8 ef fd ff ff */ call     exit /*0x8048534*/
/* 8048745: 8d 76 00 */ leal     0x0(%esi),%esi

/* 8048748: */ Label9:
/* 8048748: 55 */ push     %ebp
/* 8048749: 89 e5 */ mov      %esp,%ebp
/* 804874b: 83 ec 10 */ sub      $0x10,%esp
/* 804874e: 56 */ push     %esi
/* 804874f: 53 */ push     %ebx
/* 8048750: 8b 5d 08 */ movl     0x8(%ebp),%ebx
/* 8048753: 8b 75 18 */ movl     0x18(%ebp),%esi
/* 8048756: 83 c4 f4 */ add      $0xfffffff4,%esp
/* 8048759: ff 75 14 */ pushl    0x14(%ebp)
/* 804875c: ff 75 10 */ pushl    0x10(%ebp)
/* 804875f: ff 75 0c */ pushl    0xc(%ebp)
/* 8048762: 68 e0 89 04 08 */ push     $P_String9 /* pointing to .rodata */
/* 8048767: 53 */ push     %ebx
/* 8048768: e8 17 fd ff ff */ call     fprintf /*0x8048484*/
/* 804876d: 83 c4 20 */ add      $0x20,%esp
/* 8048770: 83 c4 fc */ add      $0xfffffffc,%esp
/* 8048773: 56 */ push     %esi
/* 8048774: 83 c4 fc */ add      $0xfffffffc,%esp
/* 8048777: 6a 05 */ push     $0x5
/* 8048779: 68 ec 89 04 08 */ push     $P_String10 /* pointing to .rodata */
/* 804877e: 6a 00 */ push     $0x0
/* 8048780: e8 1f fd ff ff */ call     dcgettext /*0x80484a4*/
/* 8048785: 83 c4 10 */ add      $0x10,%esp
/* 8048788: 50 */ push     %eax
/* 8048789: 53 */ push     %ebx
/* 804878a: e8 f5 fc ff ff */ call     fprintf /*0x8048484*/
/* 804878f: 83 c4 f8 */ add      $0xfffffff8,%esp
/* 8048792: 53 */ push     %ebx
/* 8048793: 83 c4 fc */ add      $0xfffffffc,%esp
/* 8048796: 6a 05 */ push     $0x5
/* 8048798: 68 00 8a 04 08 */ push     $P_String11 /* pointing to .rodata */
/* 804879d: 6a 00 */ push     $0x0
/* 804879f: e8 00 fd ff ff */ call     dcgettext /*0x80484a4*/
/* 80487a4: 83 c4 10 */ add      $0x10,%esp
/* 80487a7: 50 */ push     %eax
/* 80487a8: e8 47 fd ff ff */ call     fputs /*0x80484f4*/
/* 80487ad: 8d 65 e8 */ leal     0xffffffe8(%ebp),%esp
/* 80487b0: 5b */ pop      %ebx
/* 80487b1: 5e */ pop      %esi
/* 80487b2: c9 */ leave
/* 80487b3: c3 */ ret

/* Sub_Function size - 400 bytes */

/* 8048624: */ Label7:
/* 8048624: 55 */ push     %ebp
/* 8048625: 89 e5 */ mov      %esp,%ebp
/* 8048627: 83 ec 14 */ sub      $0x14,%esp
/* 804862a: 53 */ push     %ebx
/* 804862b: 8b 5d 08 */ movl     0x8(%ebp),%ebx
/* 804862e: 83 c4 fc */ add      $0xfffffffc,%esp
/* 8048631: a1 28 9c 04 08 */ mov      Object0, %eax /* pointing to .bss */
/* 8048636: 50 */ push     %eax
/* 8048637: 50 */ push     %eax
/* 8048638: 83 c4 fc */ add      $0xfffffffc,%esp
/* 804863b: 6a 05 */ push     $0x5
/* 804863d: 68 40 88 04 08 */ push     $P_String12 /* pointing to .rodata */
/* 8048642: 6a 00 */ push     $0x0
/* 8048644: e8 5b fe ff ff */ call     dcgettext /*0x80484a4*/
/* 8048649: 83 c4 10 */ add      $0x10,%esp
/* 804864c: 50 */ push     %eax
/* 804864d: e8 d2 fe ff ff */ call     printf /*0x8048524*/
/* 8048652: 83 c4 f4 */ add      $0xfffffff4,%esp
/* 8048655: 83 c4 fc */ add      $0xfffffffc,%esp
/* 8048658: 6a 05 */ push     $0x5
/* 804865a: 68 40 89 04 08 */ push     $P_String13 /* pointing to .rodata */
/* 804865f: 6a 00 */ push     $0x0
/* 8048661: e8 3e fe ff ff */ call     dcgettext /*0x80484a4*/
/* 8048666: 50 */ push     %eax
/* 8048667: e8 58 fe ff ff */ call     puts /*0x80484c4*/
/* 804866c: 83 c4 30 */ add      $0x30,%esp
/* 804866f: 83 c4 f4 */ add      $0xfffffff4,%esp
/* 8048672: 53 */ push     %ebx
/* 8048673: e8 bc fe ff ff */ call     exit /*0x8048534*/

/* 8048820: */ .section .rodata   
/* 8048820: */ .string " "
/* 8048824: */ .string " "
/* 8048826: */ .string " "

/* 8048840: */ P_String12:
/* 8048840: */ .string "Usage: %s [ignored command line arguments]\n  or:  %s 

OPTION\nExit with a status code indicating success.\n\nThese option names may not be abbreviated.\n\n  --help     

 display this help and exit\n  --version   output version information and exit\n"

/* 8048940: */ P_String13:
/* 8048940: */ .string "\nReport bugs to <bug-sh-utils@gnu.org>."

/* 8048968: */ P_String0:
/* 8048968: */ .string ""

/* 8048969: */ P_String1:
/* 8048969: */ .string "/usr/share/locale"

/* 804897b: */ P_String2:
/* 804897b: */ .string "sh-utils"

/* 8048984: */ P_String4:
/* 8048984: */ .string "POSIXLY_CORRECT"

/* 8048994: */ M_String0:
/* 8048994: */ .string "--help"

/* 804899b: */ M_String1:
/* 804899b: */ .string "--version"

/* 80489a5: */ P_String5:
/* 80489a5: */ .string "no one"

/* 80489ac: */ P_String6:
/* 80489ac: */ .string "2.0"

/* 80489b0: */ P_String7:
/* 80489b0: */ .string "GNU sh-utils"

/* 80489bd: */ P_String8:
/* 80489bd: */ .string "true"

/* 80489e0: */ P_String9:
/* 80489e0: */ .string "%s (%s) %s\n"

/* 80489ec: */ P_String10:
/* 80489ec: */ .string "Written by %s.\n"

/* 8048a00: */ P_String11:
/* 8048a00: */ .string "\nCopyright (C) 1999 Free Software Foundation, Inc.

\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for 

MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"


.section .bss

.comm Object0 ,4,4 /* generic object */

bash-2.05a# gcc true.s
bash-2.05a# ltrace ./a.out
__libc_start_main(0x080485d0, 1, 0xbffff7a4, 0x080483dc, 0x08048790 <unfinished ...>
__register_frame_info(0x08049a80, 0x08049ba0, 0xbffff748, 0x4004bcab, 0x4013ce58) = 0x08049ba0
setlocale(6, "")                                  = "C"
bindtextdomain("sh-utils", "/usr/share/locale")   = "/usr/share/locale"
textdomain("sh-utils")                            = "sh-utils"
exit(0 <unfinished ...>
__deregister_frame_info(0x08049a80, 0x40009c7a, 0x40014a7c, 0x40142020, 1) = 0
+++ exited (status 0) +++

bash-2.05a# strip a.out
bash-2.05a# ls -la a.out
-rwxr-xr-x    1 root     root         4460 Jul 30 12:34 a.out
bash-2.05a#


Более сложные приложения типа ps или ls работали частично, с какими-то ключами все было в порядке, с какими-то segfault. Reconstructor так и не был доведен до ума, т.к. основная цель изучения асма была в целом достигнута. Возникшие проблемы некорректной работы были вызваны и тем, что нехватало элементарных знаний в Си, и тем, что это был всего лишь тестовый проект, один из многих в те годы.

Зачем я это написал ? Не знаю, столько лет прошло, а задача, вроде как, до сих пор актуальна.

5 комментариев:

  1. Помню была вещь IDA PRO и HexRays которая делала примерно тоже самое. Хотя могу ошибаться

    ОтветитьУдалить
    Ответы
    1. Hex rays появился гораздо позже, а IDA выдает сорц, требующий ручного доведения. Задача была выдать именно компилируемый исходник, пусть и не до конца работоспособный. Повторюсь, это был демо-проект, ни о какой конкуренции с IDA речи и быть не могло.

      Удалить
  2. интерцептер настоящее зло))
    И главный вопрос... Настоящий хакер должен знать ассемблер? Вопрос именно к автору, т.к он преследовал эту идею, добился чего хотел и теперь точно может сделать вывод)

    ОтветитьУдалить
    Ответы
    1. должен, это очень полезный скилл, если ты конечно не веб хакс0р.

      Удалить