목록Pwnable.kr/Rookiss (17)
Pwnstar
계속 암호화 어렵다고 미뤄뒀던 루키스의 마지막 문제 crypto1이다 이 문제를 풀기 전에 AES128-CBC 암호화 알고리즘에 대해서 공부를 조금 해 보았다. 블록단위로 순차적으로 암호화한 개의 블록만 해독되면 나머지 블록들도 해독될 수 있음(브루트포스 등으로)평문의 각 블록은 이전 암호문과 xor 연산을 통해 암호화되고 첫번째 암호문은 initial vector가 암호문대신 사용된다.즉 이 initial vector를 알면 해독가능할듯 → 알 수가 없었다고 한다 소스코드 client.py#!/usr/bin/python from Crypto.Cipher import AES import base64 import os, sys import xmlrpclib rpc = xmlrpclib.ServerProxy..
후....rookiss에서 crypto1을 빼고 다 풀었는데, 그 중 마지막 문제이다. crypto1은 나중에 풀어야지.... 처음에는 좀 헤맸는데 그래도 금방 감을 잡은 축에 속하는 문제이다ㅋㅋ; mitigation 카나리와 nxbit만 걸려있다. IDA int __cdecl main(int argc, const char **argv, const char **envp) { char s[256]; // [esp+10h] [ebp-114h] size_t v5; // [esp+110h] [ebp-14h] size_t v6; // [esp+114h] [ebp-10h] size_t v7; // [esp+118h] [ebp-Ch] unsigned int v8; // [esp+11Ch] [ebp-8h] v8 = _..
후 엄청 오래 걸렸던 문제인데 한 번 길이 보이고 나니 오히려 alloca 문제보다 쉬운 것 같다. 소스코드 #include #include #include #include #include #include #include #include #define PAGE_SIZE 4096 void* mmap_s(void* addr, size_t length, int prot, int flags, int fd, off_t offset); void* mem_arr[257]; void clear_newlines(void){ int c; do{ c = getchar(); }while (c != '\n' && c != EOF); } void create_note(){ int i; void* ptr; for(i=0; i256..
예에에전에 write up을 보고 풀었는데도 제대로 이해하지 못해서 다시 풀어보겠다고 다짐한 후 이제야 다시 풀어본 문제이다. 이 문제는 소스코드가 있음에도 IDA가 필요했다.... 소스코드 #include #include #include void callme(){ system("/bin/sh"); } void clear_newlines(){ int c; do{ c = getchar(); }while (c != '\n' && c != EOF); } int g_canary; int check_canary(int canary){ int result = canary ^ g_canary; int canary_after = canary; int canary_before = g_canary; printf("cana..
이 문제는 rsa 암호 알고리즘에 관련된 문제인데...rsa 공부를 하고도 한참을 헤멨다. 보호기법 카나리만 걸려있다. 소스코드 int __cdecl main(int argc, const char **argv, const char **envp) { int *v3; // rsi bool v5; // dl int v6; // [rsp+Ch] [rbp-4h] setvbuf(stdout, 0LL, 2, 0LL); v3 = 0LL; setvbuf(stdin, 0LL, 1, 0LL); puts("- Buggy RSA Calculator -\n"); func[0] = (__int64)set_key; qword_602508 = (__int64)RSA_encrypt; qword_602510 = (__int64)RSA_d..
echo2 문제이다 mitigation 1번과 마찬가지로 보호기법이 하나도 걸려있지 않다.echo1과는 다르게 1번 bof메뉴를 지원하지 않고 2번 fsb와 3번 uaf 메뉴만 작동한다. partial relro만 걸려있다. bof도 가능할지도 모르고, nx가 없으니 쉘코드도 올릴수 있을 거고, 2번과 3번 메뉴 이름처럼 fsb와 uaf 둘 다 사용하는 문제일 것이다. bof는 안될것 같지만 쉘코드를 올릴 공간은 충분해보인다. 이름에 "A"*4를, 2번 fsb에 "B"*4 + "%x %x %x %x %x" 이렇게 입력을 주고 echo2 메뉴의 printf 직전에 bp를 걸고 실행해서 스택 구조를 살펴보았다. 0x41414141이 들어있는 부분이 이름을 입력하는 부분(쉘코드가 들어갈 곳) BBBB부터 ec..
echo1 문제이다. mitigation 쉘코드 실행시킬 수 있음 소스코드(IDA) int __cdecl main(int argc, const char **argv, const char **envp) { _QWORD *v3; // rax unsigned int v5; // [rsp+Ch] [rbp-24h] __int64 v6; // [rsp+10h] [rbp-20h] __int64 v7; // [rsp+18h] [rbp-18h] __int64 v8; // [rsp+20h] [rbp-10h] setvbuf(stdout, 0LL, 2, 0LL); setvbuf(stdin, 0LL, 1, 0LL); o = malloc(0x28uLL); *((_QWORD *)o + 3) = greetings; *((_QWORD..
fix라는 문제이다. mitigation은 하나도 걸려있지 않다. 소스코드 #include // 23byte shellcode from http://shell-storm.org/shellcode/files/shellcode-827.php char sc[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69" "\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"; void shellcode(){ // a buffer we are about to exploit! char buf[20]; // prepare shellcode on executable stack! strcpy(buf, sc); // overwrite return addres..