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