Let us take a tour through a disassembly dump of an ELF binary and see if we can reverse engineer it. The following output is a result of:
1 2 |
mech@dev:$ gcc -o distut distut.c mech@dev:$ objdump -d distut|grep main |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
push %ebp // 0x55 mov %esp,%ebp // 0x89 0xe5 sub $0x14,%esp // 0x83 0xec 0x14 movl $0x1,0xfffffff8(%ebp) // 0xc7 0x45 0xf8 0x01 0x00 0x00 0x00 movl $0x7a68,0xfffffff4(%ebp) // 0xc7 0x45 0xf4 0x68 0x7a 0x00 0x00 cmpl $0xa,0xfffffff8(%ebp) // 0x83 0x7d 0xf8 0x0a jne 0x80484d0 <main+32> // 0x75 0x06 jmp 0x8048570 <main+192> // 0xe9 0xa1 0x00 0x00 0x00 nop // 0x90 add $0xfffffff4,%esp // 0x83 0xc4 0xf4 push $0x8048600 // 0x68 0x00 0x86 0x04 0x08 call 0x80483b0 <printf> // 0xe8 0xd3 0xfe 0xff 0xff add $0x10,%esp // 0x83 0xc4 0x10 add $0xfffffffc,%esp // 0x83 0xc4 0xfc mov 0x8049768,%eax // 0xa1 0x68 0x97 0x04 0x08 push %eax // 0x50 push $0x8 // 0x6a 0x08 lea 0xffffffec(%ebp),%eax // 0x8d 0x45 0xec push %eax // 0x50 call 0x8048380 <fgets> // 0xe8 0x8c 0xfe 0xff 0xff add $0x10,%esp // 0x83 0xc4 0x10 add $0xfffffffc,%esp // 0x83 0xc4 0xfc push $0x0 // 0x6a 0x00 push $0x0 // 0x6a 0x00 lea 0xffffffec(%ebp),%eax // 0x8d 0x45 0xec push %eax // 0x50 call 0x8048390 <strtol> // 0xe8 0x89 0xfe 0xff 0xff 0xff add $0x10,%esp // 0x83 0xc4 0x10 mov %eax,%eax // 0x89 0xc0 mov %eax,0xfffffffc(%ebp) // 0x89 0x45 0xfc mov 0xfffffffc(%ebp),%eax // 0x8b 0x45 0xfc cmp 0xfffffff4(%ebp),%eax // 0x3b 0x45 0xf4 jne 0x8048538 <main+136> // 0x75 0x21 add $0xfffffff8,%esp // 0x83 0xc4 0xf8 mov 0xfffffff8(%ebp),%eax // 0x8b 0x45 0xf8 push %eax // 0x50 push $0x8048620 // 0x68 0x20 0x86 0x04 0x08 call 0x80483b0 <printf> // 0xe8 0x88 0xfe 0xff 0xff add $0x10,%esp // 0x83 0xc4 0x10 add $0xfffffff4,%esp // 0x83 0xc4 0xf4 push $0x0 // 0x6a 0x00 call 0x80483c0 <exit> // 0xe8 0x8b 0xfe 0xff 0xff add $0x10,%esp // 0x83 0xc4 0x10 mov 0xfffffffc(%ebp),%eax // 0x8b 0x45 0xfc cmp 0xfffffff4(%ebp),%eax // 0x3b 0x45 0xf4 jle 0x8048550 <main+160> // 0x7e 0x10 add $0xfffffff4,%esp // 0x83 0xc4 0xf4 call 0x80483b0 <printf> // 0xe8 0x63 0xfe 0xff 0xff add $0x10,%esp // 0x83 0xc4 0x10 mov 0xfffffffc(%ebp),%eax // 0x8b 0x45 0xfc cmp 0xfffffff4(%ebp),%eax // 0x3b 0x45 0xf4 jge 0x8048568 <main+184> // 0x7d 0x10 add $0xfffffff4,%esp // 0x83 0xc4 0xf4 push $0x804864a // 0x68 0x4a 0x86 0x04 0x08 call 0x80483b0 <printf> // 0xe8 0x4b 0xfe 0xff 0xff add $0x10,%esp // 0x83 0xc4 0x10 incl 0xfffffff8(%ebp) // 0xff 0x45 0xf8 jmp 0x80484c4 <main+20> // 0xe9 0x54 0xff 0xff xor %eax,%eax // 0x31 0xc0 jmp 0x8048574 <main+196> // 0xeb 0x00 leave // 0xc9 ret // 0xc3 nop // 0x90 nop // 0x90 nop // 0x90 |
The reader is assumed to be familiar with the above… Read More ›