Werde mir später nochmal die Zeit nehmen das zu verstehen, danke schonmal.
Ich habe jetzt zum Üben eine andere ähnliche Aufgabe genommen und mich daran versucht. Assembler-Code sieht so aus:
Code:
Dump of assembler code for function check_key:
0x00000000004005bd <+0>: push rbp
0x00000000004005be <+1>: mov rbp,rsp
0x00000000004005c1 <+4>: sub rsp,0x20
0x00000000004005c5 <+8>: mov QWORD PTR [rbp-0x18],rdi
0x00000000004005c9 <+12>: mov rax,QWORD PTR [rbp-0x18]
0x00000000004005cd <+16>: mov rdi,rax
0x00000000004005d0 <+19>: mov eax,0x0
0x00000000004005d5 <+24>: call 0x4004c0 <atoi@plt>
0x00000000004005da <+29>: mov DWORD PTR [rbp-0x4],eax
0x00000000004005dd <+32>: cmp DWORD PTR [rbp-0x4],0x0
0x00000000004005e1 <+36>: jne 0x4005ea <check_key+45>
0x00000000004005e3 <+38>: mov eax,0xffffffff
0x00000000004005e8 <+43>: jmp 0x400621 <check_key+100>
0x00000000004005ea <+45>: shl DWORD PTR [rbp-0x4],0x4
0x00000000004005ee <+49>: mov eax,DWORD PTR [rbp-0x4]
0x00000000004005f1 <+52>: mov edx,eax
0x00000000004005f3 <+54>: shr edx,0x1f
0x00000000004005f6 <+57>: add eax,edx
0x00000000004005f8 <+59>: sar eax,1
0x00000000004005fa <+61>: mov DWORD PTR [rbp-0x4],eax
0x00000000004005fd <+64>: sar DWORD PTR [rbp-0x4],0x2
0x0000000000400601 <+68>: add DWORD PTR [rbp-0x4],0xf93a
0x0000000000400608 <+75>: sub DWORD PTR [rbp-0x4],0x316
0x000000000040060f <+82>: cmp DWORD PTR [rbp-0x4],0x17
0x0000000000400613 <+86>: jne 0x40061c <check_key+95>
0x0000000000400615 <+88>: mov eax,0x0
0x000000000040061a <+93>: jmp 0x400621 <check_key+100>
0x000000000040061c <+95>: mov eax,0x1
0x0000000000400621 <+100>: leave
0x0000000000400622 <+101>: ret
Jetzt hab ich praktisch 2 Versionen, die allerdings beide nicht funktionieren.
Einmal das "sar" also normales "shr" interpretiert:
Code:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int var0;
int i;
for (i = 0; i<=9223372036854775807; i++) {
var0 = i;
var0 = var0 << 4;
var0 = ((var0 >> 0x1f) + var0) >> 1;
var0 = var0 >> 2;
var0 += 0xf93a;
var0 -= 0x316;
if (var0 == 0x17) {
printf("Key: %d \n", i);
fflush(stdout);
}
}
}
Und einmal das "sar" als n-Fache Division durch 2:
Code:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int var0;
int i;
for (i = 0; 9223372036854775807; i++) {
var0 = i;
var0 = var0 << 4;
var0 = ((var0 >> 0x1f) + var0) / 2;
var0 = var0 / 4;
var0 += 0xf93a;
var0 -= 0x316;
if (var0 == 0x17) {
printf("Key: %d \n", i);
fflush(stdout);
}
}
}
Allerdings scheint das beides nicht richtig zu sein. Die 1. Variante gibt falsche Keys aus und die 2. Variante gibt (zumindest nach ein paar Minuten) garkeine Keys aus.
Ich hätte vermutet dass die erste Variante wieder passt, da für das Beispiel von gestern (also "sar" als normalen Shift übersetzen) alles perfekt passte.
Evtl. hab ich also so etwas falsch gemacht.
Vllt sieht jemand den Fehler.
Ich hänge nochmal das Programm an, dann kann man auf Wunsch selbst testen.
Eine Sache noch: Ich hab jetzt schon einige Aufgaben gerechnet und hier ein anderes Beispiel:
Code:
Dump of assembler code for function check_key:
0x00000000004005bd <+0>: push rbp
0x00000000004005be <+1>: mov rbp,rsp
0x00000000004005c1 <+4>: sub rsp,0x20
0x00000000004005c5 <+8>: mov QWORD PTR [rbp-0x18],rdi
0x00000000004005c9 <+12>: mov rax,QWORD PTR [rbp-0x18]
0x00000000004005cd <+16>: mov rdi,rax
0x00000000004005d0 <+19>: mov eax,0x0
0x00000000004005d5 <+24>: call 0x4004c0 <atoi@plt>
0x00000000004005da <+29>: mov DWORD PTR [rbp-0x4],eax
0x00000000004005dd <+32>: cmp DWORD PTR [rbp-0x4],0x0
0x00000000004005e1 <+36>: jne 0x4005ea <check_key+45>
0x00000000004005e3 <+38>: mov eax,0xffffffff
0x00000000004005e8 <+43>: jmp 0x40062c <check_key+111>
0x00000000004005ea <+45>: mov edx,DWORD PTR [rbp-0x4]
0x00000000004005ed <+48>: mov eax,edx
0x00000000004005ef <+50>: shl eax,0x2
0x00000000004005f2 <+53>: add eax,edx
0x00000000004005f4 <+55>: add eax,eax
0x00000000004005f6 <+57>: mov DWORD PTR [rbp-0x4],eax
0x00000000004005f9 <+60>: mov eax,DWORD PTR [rbp-0x4]
0x00000000004005fc <+63>: mov edx,eax
0x00000000004005fe <+65>: shr edx,0x1f
0x0000000000400601 <+68>: add eax,edx
0x0000000000400603 <+70>: sar eax,1
0x0000000000400605 <+72>: mov DWORD PTR [rbp-0x4],eax
0x0000000000400608 <+75>: sar DWORD PTR [rbp-0x4],0x3
0x000000000040060c <+79>: add DWORD PTR [rbp-0x4],0x7494
0x0000000000400613 <+86>: sub DWORD PTR [rbp-0x4],0x1f3
0x000000000040061a <+93>: cmp DWORD PTR [rbp-0x4],0x17
0x000000000040061e <+97>: jne 0x400627 <check_key+106>
0x0000000000400620 <+99>: mov eax,0x0
0x0000000000400625 <+104>: jmp 0x40062c <check_key+111>
0x0000000000400627 <+106>: mov eax,0x1
0x000000000040062c <+111>: leave
0x000000000040062d <+112>: ret
End of assembler dump.
Den Keygen-Code dazu habe ich so übersetzt:
Code:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int var0;
int i;
for (i = 0; i<9223372036854775807; i++) {
var0 = i;
var0 = ((var0 << 2) + var0) * 2;
var0 = ((var0 >> 0x1f) + var0) >> 1;
var0 >>= 3;
var0 += 0x7494;
var0 -= 0x1f3;
if (var0 == 0x17) {
printf("Key: %d \n", i);
fflush(stdout);
}
}
}
Also das "sar" wieder ganz normal als Shift rückübersetzt. Bei der Lösung kriege ich auch nur richtige Schlüssel ausgegeben.
Ich sehe eigentlich keinen Unterschied zu der 1. Version von oben. Es sind halt andere Operationen aber ich habe praktisch nach dem gleichen "Verfahren" rückübersetzt. Einmal klappt es perfekt und einmal garnicht.