Added Reversing Challenges
This commit is contained in:
parent
88ee32973e
commit
ed3907e13f
|
@ -0,0 +1,193 @@
|
|||
## RickNMorty
|
||||
The main idea finding the flag is reverse the functions using Ghidhra to understand the code.
|
||||
|
||||
#### Step-1:
|
||||
After I downloaded `RickNMorty`, and decompiled it in Ghidhra, I got the **main()** as follows:
|
||||
```c
|
||||
undefined8 main(void)
|
||||
{
|
||||
int iVar1;
|
||||
time_t tVar2;
|
||||
long lVar3;
|
||||
long local_48;
|
||||
time_t local_40;
|
||||
time_t local_38;
|
||||
time_t local_30;
|
||||
long local_28;
|
||||
long local_20;
|
||||
char *local_18;
|
||||
int local_10;
|
||||
int local_c;
|
||||
|
||||
setbuf(stdin,(char *)0x0);
|
||||
setbuf(stdout,(char *)0x0);
|
||||
setbuf(stderr,(char *)0x0);
|
||||
tVar2 = time(&local_30);
|
||||
srand((uint)tVar2);
|
||||
time(&local_38);
|
||||
local_c = 1;
|
||||
local_10 = 0;
|
||||
while( true ) {
|
||||
iVar1 = rand();
|
||||
if (iVar1 % 3 + 4 < local_10) break;
|
||||
iVar1 = rand();
|
||||
local_20 = (long)(iVar1 % 10 + 6);
|
||||
iVar1 = rand();
|
||||
local_28 = (long)(iVar1 % 10 + 6);
|
||||
printf("%d %d\n",local_20,local_28);
|
||||
__isoc99_scanf(&DAT_0040200f,&local_48);
|
||||
lVar3 = function1(local_20);
|
||||
lVar3 = function2(lVar3 + 3);
|
||||
if (lVar3 != local_48) {
|
||||
local_c = 0;
|
||||
}
|
||||
local_10 = local_10 + 1;
|
||||
}
|
||||
time(&local_40);
|
||||
local_18 = (char *)(double)(local_40 - local_38);
|
||||
printf(local_18,"fun() took %f seconds to execute \n");
|
||||
if ((local_c != 1) || (30.00000000 < (double)local_18)) {
|
||||
printf("Nahh.");
|
||||
}
|
||||
else {
|
||||
puts("Hey, you got me!");
|
||||
system("cat flag.txt");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
#### Step-2:
|
||||
A pair of random numbers is generated and passed through `function1()` & `function2()` and checked with pair of numbers with given number to get the flag.
|
||||
|
||||
```c
|
||||
long function1(long param_1,long param_2)
|
||||
{
|
||||
int local_10;
|
||||
int local_c;
|
||||
|
||||
local_c = 0;
|
||||
local_10 = 1;
|
||||
while ((local_10 <= param_1 || (local_10 <= param_2))) {
|
||||
if ((param_1 % (long)local_10 == 0) && (param_2 % (long)local_10 == 0)) {
|
||||
local_c = local_10;
|
||||
}
|
||||
local_10 = local_10 + 1;
|
||||
}
|
||||
return (long)local_c;
|
||||
}
|
||||
```
|
||||
|
||||
```c
|
||||
long function2(long param_1)
|
||||
{
|
||||
long lVar1;
|
||||
|
||||
if (param_1 == 0) {
|
||||
lVar1 = 1;
|
||||
}
|
||||
else {
|
||||
lVar1 = function2(param_1 + -1);
|
||||
lVar1 = lVar1 * param_1;
|
||||
}
|
||||
return lVar1;
|
||||
}
|
||||
```
|
||||
|
||||
#### Step-3:
|
||||
So, I wrote this `exploit.py` to get the flag:
|
||||
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
context.log_level='DEBUG'
|
||||
p = remote('chall.csivit.com', 30827) #Remote netcat
|
||||
|
||||
def fun1(param_1, param_2):
|
||||
local_c = 0
|
||||
local_10 = 1
|
||||
while (local_10 <= param_1) or (local_10 <= param_2):
|
||||
if (param_1 % local_10 == 0) and (param_2 % local_10 == 0):
|
||||
local_c = local_10
|
||||
local_10 += 1
|
||||
return local_c
|
||||
|
||||
def fun2(param_1):
|
||||
lvar1 = 0
|
||||
if param_1 == 0:
|
||||
lvar1 = 1
|
||||
else:
|
||||
lvar1 = fun2(param_1 - 1)
|
||||
lvar1 = lvar1 * param_1
|
||||
return lvar1
|
||||
|
||||
while True:
|
||||
line = p.recvline()
|
||||
if not line or line.decode().startswith('fun() took'):
|
||||
break
|
||||
|
||||
nums = line.decode().rstrip().split(' ')
|
||||
ans = fun1(int(nums[0]), int(nums[1]))
|
||||
ans = fun2(ans + 3)
|
||||
p.sendline(str(ans))
|
||||
|
||||
p.stream()
|
||||
```
|
||||
|
||||
#### Step-4:
|
||||
Running the script gave me:
|
||||
|
||||
```bash
|
||||
[DEBUG] PLT 0x40102c puts
|
||||
[DEBUG] PLT 0x401040 setbuf
|
||||
[DEBUG] PLT 0x401050 system
|
||||
[DEBUG] PLT 0x401060 printf
|
||||
[DEBUG] PLT 0x401070 srand
|
||||
[DEBUG] PLT 0x401080 time
|
||||
[DEBUG] PLT 0x401090 __isoc99_scanf
|
||||
[DEBUG] PLT 0x4010a0 rand
|
||||
[*]
|
||||
Arch: amd64-64-little
|
||||
RELRO: Partial RELRO
|
||||
Stack: No canary found
|
||||
NX: NX enabled
|
||||
PIE: No PIE (0x400000)
|
||||
[+] Opening connection to chall.csivit.com on port 30827: Done
|
||||
[DEBUG] Received 0x6 bytes:
|
||||
b'11 15\n'
|
||||
[DEBUG] Sent 0x3 bytes:
|
||||
b'24\n'
|
||||
[DEBUG] Received 0x5 bytes:
|
||||
b'9 12\n'
|
||||
[DEBUG] Sent 0x4 bytes:
|
||||
b'720\n'
|
||||
[DEBUG] Received 0x5 bytes:
|
||||
b'7 10\n'
|
||||
[DEBUG] Sent 0x3 bytes:
|
||||
b'24\n'
|
||||
[DEBUG] Received 0x5 bytes:
|
||||
b'9 11\n'
|
||||
[DEBUG] Sent 0x3 bytes:
|
||||
b'24\n'
|
||||
[DEBUG] Received 0x5 bytes:
|
||||
b'8 10\n'
|
||||
[DEBUG] Sent 0x4 bytes:
|
||||
b'120\n'
|
||||
[DEBUG] Received 0x5 bytes:
|
||||
b'6 13\n'
|
||||
[DEBUG] Sent 0x3 bytes:
|
||||
b'24\n'
|
||||
[DEBUG] Received 0x28 bytes:
|
||||
b'fun() took 0.000000 seconds to execute \n'
|
||||
[DEBUG] Received 0x11 bytes:
|
||||
b'Hey, you got me!\n'
|
||||
Hey, you got me!
|
||||
[DEBUG] Received 0x28 bytes:
|
||||
b'csictf{h3_7u2n3d_h1m531f_1n70_4_p1ck13}\n'
|
||||
csictf{h3_7u2n3d_h1m531f_1n70_4_p1ck13}
|
||||
```
|
||||
Voila! We got the flag.
|
||||
|
||||
#### Step-5:
|
||||
Finally the flag becomes:
|
||||
`csictf{h3_7u2n3d_h1m531f_1n70_4_p1ck13}`
|
Binary file not shown.
|
@ -0,0 +1,34 @@
|
|||
from pwn import *
|
||||
|
||||
context.log_level='DEBUG'
|
||||
p = remote('chall.csivit.com', 30827) #Remote netcat
|
||||
|
||||
def fun1(param_1, param_2):
|
||||
local_c = 0
|
||||
local_10 = 1
|
||||
while (local_10 <= param_1) or (local_10 <= param_2):
|
||||
if (param_1 % local_10 == 0) and (param_2 % local_10 == 0):
|
||||
local_c = local_10
|
||||
local_10 += 1
|
||||
return local_c
|
||||
|
||||
def fun2(param_1):
|
||||
lvar1 = 0
|
||||
if param_1 == 0:
|
||||
lvar1 = 1
|
||||
else:
|
||||
lvar1 = fun2(param_1 - 1)
|
||||
lvar1 = lvar1 * param_1
|
||||
return lvar1
|
||||
|
||||
while True:
|
||||
line = p.recvline()
|
||||
if not line or line.decode().startswith('fun() took'):
|
||||
break
|
||||
|
||||
nums = line.decode().rstrip().split(' ')
|
||||
ans = fun1(int(nums[0]), int(nums[1]))
|
||||
ans = fun2(ans + 3)
|
||||
p.sendline(str(ans))
|
||||
|
||||
p.stream()
|
Loading…
Reference in New Issue