Description
Category: Reversing/Binary
Source: Pragyan CTF 19
Points: 150
Author: Jisoon Park(js00n.park)
Description:
Can you cook the most delicious recipe?
nc 159.89.166.12 9800
Write-up
main() 함수를 보면 임의로 생성된 세 숫자를 보여주고 '-' 또는 숫자로만 구성된 입력을 받는데, 길이제한 없이 "%s"로 받아서 bof 가 가능한 형태이다.
[...]
char s[10]; // [rsp+32h] [rbp-6Eh]
char nptr; // [rsp+3Ch] [rbp-64h]
char v15; // [rsp+46h] [rbp-5Ah]
[...]
__isoc99_scanf("%s", s);
for ( i = 0; i < strlen(s); ++i )
{
if ( (s[i] <= 0x2F || s[i] > 0x39) && s[i] != 45 )// '-' and numbers only
{
puts("Invalid input :( ");
return 0;
}
}
v9 = atoi(s);
v10 = atoi(&nptr);
v11 = atoi(&v15);
if ( v6 == v9 + v10 )
{
if ( v7 == v10 + v11 )
{
if ( v8 == v11 + v9 )
{
stream = fopen("flag.txt", "r");
if ( !stream )
{
fwrite("\nflag.txt doesn't exist.\n", 1uLL, 0x19uLL, stderr);
exit(0);
}
fgets(&v16, 50, stream);
printf("That's yummy.... Here is your gift:\n%s", &v16);
[...]
bof로 값을 덮어쓸 수 있는 변수는 s, nptr, v15 세 가지로, 각각 10 byte의 크기를 갖는다. (그 이후는 의미가 없거나 canary가 있다.)
값을 마음대로 줄 수 있는 세 변수에 대해 atoi()를 수행하고, 그 값을 이용한 if 조건문을 통과하면 간단히 flag를 준다.
if 조건문 세가지는 처음에 알려준 v6, v7, v8에 대한 것으로, 손으로도 쉽게 풀 수 있다.
한 가지 생각해야 하는건 '-'와 숫자만 입력받기 때문에, 앞을 0으로 채워서 길이를 맞춰줘야 한다.
간단히 방정식을 해결하고 payload를 구성하여 전송하는 exploit을 만들어서 flag를 얻었다.
Flag : pctf{p1zz4_t0pp3d_w1th_p1n34ppl3_s4uc3}
'writeups > Reversing' 카테고리의 다른 글
ELF Crumble (0) | 2019.11.26 |
---|---|
Super Secure Vault (0) | 2019.11.26 |
Snakes over cheese (0) | 2019.11.25 |
Secrets (0) | 2019.11.25 |
Local News (0) | 2019.11.25 |