Es gibt ein Programm, mit einer Funktion A die in der main aufgerufen wird und einer anderen geheimen Funktion B.
Nun möchte ich gerne die Rücksprungadresse von Funktion A mit der Adresse von Funktion B überschreiben.
Sämtliche Schutzmechanismen des Betriebssystems und vom gcc sind ausgeschaltet bzw ohne kompiliert worden.
Der disassemblierte Code der Funtkion A sieht so aus:
Code:
0x0000000000400af3 <+0>: push rbp 0x0000000000400af4 <+1>: mov rbp,rsp 0x0000000000400af7 <+4>: sub rsp,0x150 0x0000000000400afe <+11>: lea rax,[rbp-0x150] 0x0000000000400b05 <+18>: mov esi,0xf4 0x0000000000400b0a <+23>: mov rdi,rax 0x0000000000400b0d <+26>: call 0x400850 <bzero@plt> 0x0000000000400b12 <+31>: mov eax,DWORD PTR [rip+0x2015d8] # 0x6020f0 <newsockfd> 0x0000000000400b18 <+37>: lea rcx,[rbp-0x150] 0x0000000000400b1f <+44>: mov edx,0x200 0x0000000000400b24 <+49>: mov rsi,rcx 0x0000000000400b27 <+52>: mov edi,eax 0x0000000000400b29 <+54>: call 0x4007f0 <read@plt> 0x0000000000400b2e <+59>: mov DWORD PTR [rbp-0x4],eax 0x0000000000400b31 <+62>: cmp DWORD PTR [rbp-0x4],0x0 0x0000000000400b35 <+66>: jns 0x400b41 <main_loop+78> 0x0000000000400b37 <+68>: mov edi,0x400db7 0x0000000000400b3c <+73>: call 0x40097d <error> 0x0000000000400b41 <+78>: mov eax,DWORD PTR [rbp-0x4] 0x0000000000400b44 <+81>: movsxd rdx,eax 0x0000000000400b47 <+84>: mov eax,DWORD PTR [rip+0x2015a3] # 0x6---020f0 <newsockfd> 0x0000000000400b4d <+90>: lea rcx,[rbp-0x150] 0x0000000000400b54 <+97>: mov rsi,rcx 0x0000000000400b57 <+100>: mov edi,eax 0x0000000000400b59 <+102>: call 0x4007a0 <write@plt> 0x0000000000400b5e <+107>: mov DWORD PTR [rbp-0x4],eax 0x0000000000400b61 <+110>: cmp DWORD PTR [rbp-0x4],0x0 0x0000000000400b65 <+114>: jns 0x400b71 <main_loop+126> 0x0000000000400b67 <+116>: mov edi,0x400dd1 0x0000000000400b6c <+121>: call 0x40097d <error> 0x0000000000400b71 <+126>: lea rax,[rbp-0x150] 0x0000000000400b78 <+133>: mov rsi,rax 0x0000000000400b7b <+136>: mov edi,0x400de9 0x0000000000400b80 <+141>: mov eax,0x0 0x0000000000400b85 <+146>: call 0x4007d0 <printf@plt> 0x0000000000400b8a <+151>: leave 0x0000000000400b8b <+152>: ret
Meinem Verständnis nach sollten hinter diesen 336Byte die Rücksprungadresse kommen.
Nun weiß ich, dass die Adresse der Funktion B folgende ist:
0x00000000004009b0
Diese muss ich ja dann umwandeln in:
\xb0\x09\x40\x00\x00\x00\x00\x00
Wenn ich das Programm nun starte (es ist ein Echo Server) und mit meinem Echo Client eine Eingabe schicke (336*A + \xb0\x09\x40\x00\x00\x00\x00\x00) sollte er doch eigentlich die Rücksprungadresse überschreiben.
Allerdings kriege ich dann nur einen Segmentation Fault.
Also habe ich durch ausprobieren geguckt wann der erste Segfault kommt. Das passiert bei 344 Zeichen. Also 343 Zeichen nimmt er noch normal an. Habe also 343*A+\xb0\x09\x40\x00\x00\x00\x00\x00 als Eingabe genommen und es kommt wieder ein Segmentation Fault :/
Ist die Adresse vllt falsch umgeformt? Beim Professor, der es in der Vorlesung genau so gemacht hat klappte alles.
Hoffe mir kann da jemand helfen.
Grüße







