elliptic@elliptic:~/solved/bin2002$ ./Game.bin
Usage: ./Game.bin
keyFile - The file containing your CD Key
Strings table and cat were both uninteresting. Disassembling the main function in GDB yielded some nice things.
. Stack initialization
0x0804896c <+0>: push ebp
0x0804896d <+1>: mov ebp,esp
0x0804896f <+3>: push ebx
0x08048970 <+4>: and esp,0xfffffff0
0x08048973 <+7>: sub esp,0x170
. If fewer than 1 parameter, jump to 0x80489AC
0x08048979 <+13>: cmp DWORD PTR [ebp+0x8],0x1
0x0804897d <+17>: jg 0x80489ac
. Usage
0x0804897f <+19>: mov eax,DWORD PTR [ebp+0xc]
0x08048982 <+22>: mov eax,DWORD PTR [eax]
0x08048984 <+24>: mov DWORD PTR [esp+0x4],eax
0x08048988 <+28>: mov DWORD PTR [esp],0x8049d90 ; 0x8049d90 = "Usage: %s
0x0804898f <+35>: call 0x80487e0
0x08048994 <+40>: mov DWORD PTR [esp],0x8049da8 ; 0x8049da8 = "\nkeyFile - The file containing your CD Key"
0x0804899b <+47>: call 0x8048840
0x080489a0 <+52>: mov DWORD PTR [esp],0x0
0x080489a7 <+59>: call 0x8048870
. Body
0x080489ac <+64>: mov eax,DWORD PTR [ebp+0xc]
0x080489af <+67>: add eax,0x4
0x080489b2 <+70>: mov eax,DWORD PTR [eax]
0x080489b4 <+72>: mov DWORD PTR [esp+0x4],0x8049dd3 ; 0x8049dd3 = "rb"
0x080489bc <+80>: mov DWORD PTR [esp],eax
0x080489bf <+83>: call 0x80487d0
0x080489c4 <+88>: mov DWORD PTR [esp+0x160],eax
0x080489cb <+95>: cmp DWORD PTR [esp+0x160],0x0 ; Check if we can open the file
0x080489d3 <+103>: jne 0x80489ed
0x080489d5 <+105>: mov DWORD PTR [esp],0x8049dd8 ; 0x8049dd8 = "Error - couldn't open key file"
0x080489dc <+112>: call 0x8048790
0x080489e1 <+117>: mov DWORD PTR [esp],0x1
0x080489e8 <+124>: call 0x8048870
0x080489ed <+129>: mov eax,DWORD PTR [esp+0x160]
0x080489f4 <+136>: mov DWORD PTR [esp+0xc],eax ; file pointer
0x080489f8 <+140>: mov DWORD PTR [esp+0x8],0x1 ; number of elements in buffer (1)
0x08048a00 <+148>: mov DWORD PTR [esp+0x4],0x80 ; size of elements in buffer (0x80 = 128 bytes)
0x08048a08 <+156>: lea eax,[esp+0xb8]
0x08048a0f <+163>: mov DWORD PTR [esp],eax ; buffer
0x08048a12 <+166>: call 0x8048850
0x08048a17 <+171>: mov DWORD PTR [esp+0x15c],eax
0x08048a1e <+178>: cmp DWORD PTR [esp+0x15c],0x1 ; if successful (fread returns the number of elements successfully read)
0x08048a26 <+186>: je 0x8048a59
0x08048a28 <+188>: mov eax,ds:0x804a16c
0x08048a2d <+193>: mov DWORD PTR [esp+0xc],eax
0x08048a31 <+197>: mov DWORD PTR [esp+0x8],0x1f
0x08048a39 <+205>: mov DWORD PTR [esp+0x4],0x1
0x08048a41 <+213>: mov DWORD PTR [esp],0x8049df8 ; 0x8049df8 = "Error: couldn't read whole key\n"
0x08048a48 <+220>: call 0x80487f0
0x08048a4d <+225>: mov DWORD PTR [esp],0x2
0x08048a54 <+232>: call 0x8048870
Here, the program calls a bunch of really scary things like time and random, probably to compare against the key you enter. The correct key is 128 bytes of randomness? Probably not the key you're looking for.
0x08048a59 <+237>: mov DWORD PTR [esp],0x0
0x08048a60 <+244>: call 0x8048810
The more interesting part; why is it calling SDL functions? SDL is used for drawing.
0x08048b67 <+507>: mov DWORD PTR [esp],0x0
0x08048b6e <+514>: call 0x80487c0
0x08048b73 <+519>: test eax,eax
0x08048b75 <+521>: je 0x8048ba2
0x08048b77 <+523>: call 0x8048860
0x08048b7c <+528>: mov edx,DWORD PTR ds:0x804a16c
0x08048b82 <+534>: mov DWORD PTR [esp+0x8],eax
0x08048b86 <+538>: mov DWORD PTR [esp+0x4],0x8049e30
0x08048b8e <+546>: mov DWORD PTR [esp],edx
0x08048b91 <+549>: call 0x8048800
0x08048b96 <+554>: mov DWORD PTR [esp],0x4
0x08048b9d <+561>: call 0x8048870
0x08048ba2 <+566>: mov DWORD PTR [esp+0xc],0x0
0x08048baa <+574>: mov DWORD PTR [esp+0x8],0x10
0x08048bb2 <+582>: mov DWORD PTR [esp+0x4],0x12c
0x08048bba <+590>: mov DWORD PTR [esp],0x140
0x08048bc1 <+597>: call 0x8048780
...
0x08049ce0 <+4980>: cmp ax,0x13f
0x08049ce4 <+4984>: jle 0x8049c85
0x08049ce6 <+4986>: mov DWORD PTR [esp],0x3
0x08049ced <+4993>: call 0x8048830
0x08049cf2 <+4998>: mov eax,0x0
0x08049cf7 <+5003>: mov ebx,DWORD PTR [ebp-0x4]
0x08049cfa <+5006>: leave
0x08049cfb <+5007>: ret
We don't actually need the key to get here. Jumping to 0x08048b67 runs the SDL code:
(gdb) break main
Breakpoint 1 at 0x8048970
(gdb) run
Starting program: /home/elliptic/solved/bin2002/Game.bin
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/i386-linux-gnu/i686/cmov/libthread_db.so.1".
Breakpoint 1, 0x08048970 in main ()
(gdb) jump *0x08048b67
Continuing at 0x8048b67.
..spawning the window:
MCA-B17EC0D3
No comments:
Post a Comment