🚩CTF
[HackCTF] - [Misc] 탈옥 write up
[HackCTF] - [Misc] 탈옥 write up
2020.04.26python jail 문제이다. nc로 접속하면 아래와 같이 python 코드가 출력이 되고 사용자에게 입력을 받는다. 입력받은 문자열은 필터링을 거치고 exec() 함수로 실행이 된다. python3 버전 이므로 __builtins__ 모듈을 사용하여 내장 객체를 이용할 수 있다. 아래와 같이 dir() 함수로 __builtins__ 모듈에 포함되어 있는 메소드를 볼 수 있다. __dict__ 를 사용하여 dictionary 타입으로 출력 할 수 있다. dictionary 타입으로 변경을 했기 때문에, 위에 나와있는 키 값을 이용하여 payload를 완성 시킨다. dictionary 타입으로 변경을 하지 않았을 때는, list 타입으로 return이 되므로 indexing 으로 사용하려는 모듈의 위치를..
[pwnable.xyz] - dirty tultle write up
[pwnable.xyz] - dirty tultle write up
2020.04.15pwnable.xyz 34번째 문제 dirty turtle 이다. Analyze 이번 문제의 사용자 정의 함수를 보면 아래와 같다. ubuntu:~/environment/ctf/pwnable.xyz/34_Dirty turtle $ func challenge __libc_csu_fini __libc_csu_init _fini _init _start get_val handler main setup win checksec으로 바이너리에 적용된 보안 기법을 보면 아래와 같다. ubuntu:~/environment/ctf/pwnable.xyz/34_Dirty turtle $ checksec --file=challenge RELRO STACK CANARY NX PIE RPATH RUNPATH Symbols FORT..
[pwnable.xyz] badayum write up
[pwnable.xyz] badayum write up
2020.03.10pwnable.xyz 30번째 문제이다. 해당 바이너리의 사용자 정의 함수를 보면 존재 하지 않았다... ubuntu:~/environment/ctf/pwnable.xyz/30_badayum $ func challenge nm: challenge: no symbols 그래서 gdb로 main 함수를 찾고 play(?) 함수와 win() 함수를 찾았다. 이를 c코드로 나타내면 아래와 같다. /* main: 0x555555554ead play??: 0x555555554d48 win: 0x555555554d30 */ long play(){ int tmp_1 = 0; // rbp-0x74 int tmp_2 = 0; // rbp-0x78 while(tmp_1 edx = 0x1f4e9d7e) edx = edx 0x..
[pwnable.xyz] Hero Factory write up
[pwnable.xyz] Hero Factory write up
2020.03.10pwnable.xyz 33번째 문제이다. Analyze 해당 바이너리에서 사용자 정의 함수들을 보면 아래와 같다. ubuntu:~/environment/ctf/pwnable.xyz/33_Hero Factory $ func challenge __libc_csu_fini __libc_csu_init _fini _init _start createHero crossfit deleteHero floss getInt hadouken handler main printFnc printHero printMenu printSuperPowers setup usePower win wrestle zeroHero gdb로 바이너리를 분석하여 c코드로 나타내면 아래와 같다. (분석 환경이 gdb 밖에 없는 내 자신이 대단..) v..
[zer0pts 2020 CTF] - notepad write up
[zer0pts 2020 CTF] - notepad write up
2020.03.09zer0pts 2020 CTF 문제 중 pwnable 분야의 notepad 이다. 문제 사이트에 접속하면 아래와 같이 출력이 된다. 소스코드는 아래와 같다. import flask import flask_bootstrap import os import pickle import base64 import datetime app = flask.Flask(__name__) app.secret_key = os.urandom(16) bootstrap = flask_bootstrap.Bootstrap(app) @app.route('/', methods=['GET']) def index(): return notepad(0) @app.route('/note/', methods=['GET']) def notepad(nid..
[zer0pts 2020 CTF] - Can you guess it? write up
[zer0pts 2020 CTF] - Can you guess it? write up
2020.03.09zer0pts 2020 CTF 문제 중 pwnable 분야의 Can you guess it? 이다. 위 문제의 소스 코드를 보면 아래와 같다.
[zer0pts 2020 CTF] hipwn write up
[zer0pts 2020 CTF] hipwn write up
2020.03.09zer0pts 2020 CTF 문제 중 pwnable 분야의 hipwn 이다. 문제 파일을 다운로드 하면 chall, main.c 파일이 존재한다. main.c 코드 내용은 아래와 같다. #include int main(void) { char name[0x100]; puts("What's your team name?"); gets(name); printf("Hi, %s. Welcome to zer0pts CTF 2020!\n", name); return 0; } ubuntu:~/environment/ctf/zer0pts/pwn/hipwn $ checksec --file=chall RELRO STACK CANARY NX PIE RPATH RUNPATH Symbols FORTIFY Fortified Fort..
Aero 2020 CTF write up - aerofloat
Aero 2020 CTF write up - aerofloat
2020.03.03Aero 2020 CTF 문제 중 pwnable 분야의 Aerofloat 문제이다. 대회 당일에는 풀지 못했지만, 롸업을 보고 재 도전 후 풀수 있게 되었다. Analyze 해당 문제의 바이너리 안에 사용자 정의 함수는 아래와 같다. ubuntu:~/environment/ctf/Aero CTF 2020/pwn/Aerofloat $ func aerofloat main menu read_buf read_int gdb로 문제 바이너리를 분석해서 c로 나타내면 아래와 같다. void menu(){ puts("1. Set rating"); puts("2. View rating list"); puts("3. View porfile info"); puts("4. Exit"); printf("> "); } int re..
[pwnable.xyz] catalog write up
[pwnable.xyz] catalog write up
2020.02.28pwnable.xyz 26번째 catalog 문제이다. Analyze 문제의 바이너리에 사용자 정의 함수를 보면 아래와 같다. ubuntu:~/environment/ctf/pwnable.xyz/26_catalog $ func challenge __libc_csu_fini __libc_csu_init _fini _init _start edit_name handler main print_menu print_name read_int32 setup win write_name gdb로 바이너리를 분석하여 c로 나타내면 아래와 같다. /* gdb-peda$ x/50gx 0x0000000000602280 0x602280 : 0x0000000000603260 0x0000000000000000 0x602290 : 0x0..
[pwnable.xyz] message write up
[pwnable.xyz] message write up
2020.02.25pwnable.xyz 20번째 message 문제이다. keyword: buffer overflow keyword: canary leak Analyze ubuntu:~/environment/ctf/pwnable.xyz/20_message $ func challenge __libc_csu_fini __libc_csu_init _fini _init _start get_choice handler main print_menu setup win gdb로 바이너리를 분석해서 c로 나타내면 아래와 같다. #include void print_menu(){ puts("Menu:\n1. Edit message.\n2. Print message.\n3. Admin?"); } int get_choice(){ char a = ..
[pwnable.xyz] rwsr write up
[pwnable.xyz] rwsr write up
2020.02.25pwnable.xyz 22번째 rwsr 문제이다. keyword: environ 변수로 stack 주소 Leak Analyze 해당 바이너리의 사용자 정의 함수는 아래와 같다. 이번에는 so 파일까지 주워젔다. ubuntu:~/environment/ctf/pwnable.xyz/22_rwsr $ func challenge __libc_csu_fini __libc_csu_init _fini _init _start handler main print_menu read_ulong setup win gdb로 바이너리를 분석해서 c로 나타내면 아래와 같다. #include void print_menu(){ printf("Menu:\n 1. Read\n 2. Write\n 0. Exit\n> "); } int read..
[pwnable.xyz] bookmark write up
[pwnable.xyz] bookmark write up
2020.02.25pwnable.xyz 24번째 문제 bookmark 이다. Analyze 해당 바이너리의 사용자 정의 함수는 아래와 같다. ubuntu:~/environment/ctf/pwnable.xyz/24_bookmark $ func challenge __libc_csu_fini __libc_csu_init _fini _init _start create_url handler init_login main print_menu read_long setup win gdb로 분석하여 c로 나타내면 다음과 같다. #include void init_login(){ int fd = open("/dev/urandom"); if(fd == -1){ exit(1); } read(fd, bm+256, 0x8); close(fd); } ..
[pwnable.xyz] uaf write up
[pwnable.xyz] uaf write up
2020.02.21pwnable.xyz 19번째 문제 uaf 이다. 이번 문제는 Use After Free 문제 인줄 알았지만, 전혀 아니었다... Analyze 해당 문제의 바이너리를 분석하면 아래와 같이 사용자 정의 함수가 많을 것을 알 수 있다. ubuntu:~/environment/ctf/pwnable.xyz/19_uaf $ func challenge __libc_csu_fini __libc_csu_init _fini _init _start calc delete_save edit_char handler initialize_game main print_menu read_int32 save_game setup win gdb 로 바이너리를 분석해서 c로 나타내면 아래와 같다. #include void initialize..
[pwnable.xyz] fspoo write up
[pwnable.xyz] fspoo write up
2020.02.21pwnable.xyz 14번째 문제 fspoo 이다. Analyze 문제의 바이너리에서 사용자 정의 함수를 보면 아래와 같다. ( "_" 함수가 있는걸 롸업 쓰면서 알게 되었다...) ubuntu:~/environment/ctf/pwnable.xyz/14_fspoo $ func challenge _ __libc_csu_fini __libc_csu_init __stack_chk_fail_local __x86.get_pc_thunk.ax __x86.get_pc_thunk.bx __x86.get_pc_thunk.dx _fini _init _start handler main setup vuln win 사용자 정의 함수 중 자세히 봐야 할 것들은 main, vuln, win 이다. gdb 로 해당 바이너리를 분석..
[pwnable.xyz] Game write up
[pwnable.xyz] Game write up
2020.02.15pwnable.xyz 13번째 Game 문제이다. ubuntu:~/environment/ctf/pwnable.xyz/13_game $ func challenge __libc_csu_fini __libc_csu_init _fini _init _start edit_name find_last_save handler init_game main play_game print_menu read_int32 save_game setup win 해당 바이너리 안에는 사용자 정의 함수가 많은 것을 볼 수 있다. Analyze 필자의 분석 환경은 매우 열악해서(IDA를 쓸 수 없는 상황..) gdb를 통해 해당 바이너리를 분석해서 c로 바꾸어 보았다. #include char saves[40]; char ops = "+-/*..
[pwnable.xyz] l33t-ness write up
[pwnable.xyz] l33t-ness write up
2020.01.31pwnable.xyz 12번째 문제 l33t-ness 이다. Analyze 이번 문제는 간단한(?) 수학 3문제를 풀면 flag를 출력하게 된다. 문제의 바이너리 파일에 사용자 정의 함수를 보면 아래와 같다. handler main round_1 round_2 round_3 setup win gdb로 분석하여 c코드로 나타내면 아래와 같다. #include #include int round_1(){ int getInt_1 = 0; // rbp-0x38 int getInt_2 = 0; // rbp-0x34 char tmp; // rbp-0x30 printf("=== 1eet ===\n"); memset(tmp, 0, 0x20); printf("x: "); read(0, tmp, 0x10); printf("..
[pwnable.xyz] Jmp table write up
[pwnable.xyz] Jmp table write up
2020.01.31pwnable.xyz 11번째 문제 Jmp table 이다. Analyze 위 문제의 사용자 정의 함수를 보면 아래와 같다. ubuntu:~/environment/ctf/pwnable.xyz/11_Jump_table $ func challenge _ do_exit do_free do_malloc do_read do_write handler main print_menu read_long setup 문제의 바이너리 파일을 gdb로 분석하여 c코드로 나타내면 아래와 같다. /* _ v 0x0000000000400a31 b do_exit v b do_free v b do_malloc v b do_read v b do_write v b handler b main v b print_menu v b read_long..
[pwnable.xyz] TLSv00 write up
[pwnable.xyz] TLSv00 write up
2020.01.28pwnable.xyz 의 10번째 문제 TLSv00 이다. Analyze 문제 파일의 사용자 정의 함수를 보면 많은 함수들이 존재하는 것을 볼 수 있다. 위 함수들을 gdb로 분석하여 c언어로 표현하면 아래와 같다. #include #include char key[64]; // 0x555555756040 char do_comment[16]; // 0x555555756080 char flag[64]; // 0x5555557560a0 void print_menu(){ printf("1. Re-generate key\n2. Load flag\n3. Print flag\n"); } int read_int32(){ memset(&rbp-0x30, 0, 0x20); *(&rbp-0x34) = read(0, &rbp..
[pwnable.xyz] free spirit write up
[pwnable.xyz] free spirit write up
2020.01.27pwnable.xyz 9번째 문제 free spirit 이다. 앞에 문제보다 시간을 꽤 소모 했고, 이해하기도 힘들었고, 배운 것들이 많았던 문제 였다. 문제를 풀기 위해서는 Heap의 구조, fastbin, House of spirit 에 대해 알고 있어야 한다. Analyze 이번 문제의 바이너리 안에 사용자 정의 함수를 찾아보면, main과 win 함수 말고는 특벌한 함수는 없다. main 함수를 gdb로 분석하여 c 코드로 나타내면 아래와 같다. #include ??? limit; // 0x60102c int main(){ *(&rsp+0x10) = malloc(0x40); // 0x602260 // &rsp+0x10 = 0x7fffffffe460 while(1){ printf("> "); rea..
[pwnable.xyz] note write up
[pwnable.xyz] note write up
2020.01.25pwnable.xyz 에서 6번째 문제 note 이다. Analyze 이번 문제의 사용자 정의 함수를 찾아보면 여러개가 있다는 것을 알 수 있다. ubuntu:~/environment/ctf/pwnable.xyz/06_note $ func challenge b edit_desc b edit_note b handler b main b print_menu b read_int32 b setup b win 해당 바이너리 파일을 gdb로 분석하여 c 코드로 나타내면 아래와 같다. #include #include #include char s[48]; int read_int32(){ read(0, &rbp-0x30, 0x20); *(&rbp-0x30) = atoi($rbp-0x30); return *(&rbp-0x3..
[pwnable.xyz] Grownup write up
[pwnable.xyz] Grownup write up
2020.01.25pwnable.xyz 의 5번째 문제 grownup 문제이다. Analyze 이번 문제의 사용자 정의 함수를 보면 특별한 함수는 없어 보인다. $ func GrownUpRedist b handler b main b setup gdb로 main 함수를 분석하여 c 코드로 나타내면 아래와 같다. #include #include #include int main(){ char a[16]; char tmp; printf("Are you 18 years or older? [y/N]:"); read(0, a, sizeof(a)); switch (a[0]){ case 'y': tmp = malloc(0x84); // &tmp = 0x602260 printf("Name: "); read(0, tmp , 0x80); //..
[pwnable.xyz] two targets write up
[pwnable.xyz] two targets write up
2020.01.02pwnable.xyz 8번째 문제 two targets 이다. 바이너리를 실행하면 아래 처럼 유저에게 name, nationality, age를 입력받는 것을 볼 수 있다. 4번을 누를 시 어떤 조건에 만족 한다면 flag를 획득 할 수 있는 것 같다. 이 문제는 제목 그대로 2개의 타겟이다. 2가지 중 하나의 방법을 택하여 문제를 풀 수 있다. 아래에는 2가지 풀이 법을 설명 해놓았다. Analyze 1 (GOT overwrite) challenge 바이너리에는 아래처럼 여러개의 사용자 정의 함수가 있을 것을 볼 수 있다. 이번에 auth 라는 새로운 함수가 등장했다. main 함수를 gdb로 분석해서 간단하게 pseudo code로 나타내면 아래와 같다. 반복 기능도 넣어야 하지만 중요한 부분만 ps..
[pwnable.xyz] xor write up
[pwnable.xyz] xor write up
2020.01.01pwnable.xyz 7번째 문제 xor 이다. 실행하면 아래와 같다. Analyze 이번 문제도 main 함수와 win 함수 말고 특별한 것은 보이지 않는다. gdb 로 main 함수를 분석 해보자. 아래 사진은 main 함수의 일부분이다. 이를 pseudo 코드로 나타내면 아래와 같다. 이번에도 8번째 줄에 Arbitrary overwrite 공격이 가능하다. 하지만 main 함수에서 역할은 XOR 연산하는 과정 말고는 없다. main 함수에 breakpoint를 걸어 vmmap 명령어를 사용하면 아래처럼 0x0000555555554000 ~ 0x0000555555555000 까지 rwxp 권한이 있는 것을 볼 수 있다. 즉, main 함수에서 특정 주소에 있는 명령어를 변조하여 공격자가 원하는 함수..
[pwnable.xyz] misalignment write up
[pwnable.xyz] misalignment write up
2020.01.01pwnable.xyz 4번째 문제 misalignment 이다. 실행 해보면 아래와 같다. Analyze 이 문제에 사용자 정의 함수는 아래와 같다. 위 바이너리 파일을 peda-gdb 로 열어 main 함수의 어셈블리어를 보자. 아래 사진은 main 함수의 일부분 이다. 위 어셈블리어 코드를 pseudo 코드로 나타내면 아래와 같다. 6번째 줄에서 Arbitrary overwrite 가 가능한 취약점이 존재하는 것을 볼 수 있다. 사용자가 입력한 3개의 인자를 잘 조작하면 Arbitrary overwrite가 가능하다. 아래 어셈블리어는 main 함수의 일부분 이다. rax에 &((rbp-0xa0) + 0xf ) 주소를 넣고 rdx에 rax 주소의 값을 넣는다. rdx 와 0xb000000b5 비교하여..
[pwnable.xyz] add write up
[pwnable.xyz] add write up
2019.12.28pwnable.xyz 세번째 문제 add 이다. 실행하면 인자 3개를 받고 어떤 값을 출력한다. 필자가 만든 명령어로 elf 파일 안에 사용자 정의 함수 list 를 보면 총 4개가 있는 것을 볼 수 있다. 그 중 main과 win 함수가 눈에 띄인다. ubuntu:~/environment/ctf/pwnable.xyz/03_add $ func challenge b handler b main b setup b win ubuntu:~/environment/ctf/pwnable.xyz/03_add $ (elf 파일에 사용자 정의 함수 출력하기) [Find user defined functions] elf에 사용자 정의 함수 찾기 CTF 문제를 풀때 ELF 파일을 GDB로 분석할 때가 있는데, 어떤 사용자 정의..
[pwnable.xyz] sub write up
[pwnable.xyz] sub write up
2019.12.28pwnable.xyz 두번째 문제 sub 이다. 바이너리 파일을 다운 받은 뒤 실행하면 아래와 같이 동작하는 것을 볼 수 있다. ubuntu:~/environment/ctf/pwnable.xyz/02_sub $ ./challenge 1337 input: 1 1 ubuntu:~/environment/ctf/pwnable.xyz/02_sub $ ./challenge 1337 input: 1337 1337 ubuntu:~/environment/ctf/pwnable.xyz/02_sub $ 이 바이너리에 main 함수 및 사용자 정의 함수의 존재 여부를 확인하기 위해 필자가 만들어 놓은 명령어로 확인해 보면, main 함수 및 사용자 정의 함수가 존재하지 않는 것을 볼 수 있다. ubuntu:~/environme..
[pwnable.xyz] Welcome write up
[pwnable.xyz] Welcome write up
2019.12.26pwnable.xyz 사이트의 첫번째 문제 Welcome 문제이다, Excute 우선 실행해보면 아래 처럼 출력이 되는 것을 볼 수 있다. ubuntu:~/environment/ctf/pwnable.xyz/01_welcome/image/challenge $ ./challenge Welcome. Leak: 0x7fb7e0f42010 Length of your message: 1 Enter your message: 1 Analyze peda-gdb로 이번 문제를 분석해보겠다. main 함수를 보려고 하니 찾을 수가 없다. 리눅스에서 main 함수의 주소를 찾기 위해서는 __libc_start_main 에 대해서 알아야 한다. main 함수 찾기 아래 사이트를 보면 설명이 잘 되어 있다. main startu..
[LOB] - zombie_assassin -> succubus 풀이
[LOB] - zombie_assassin -> succubus 풀이
2019.10.06/* The Lord of the BOF : The Fellowship of the BOF - succubus - calling functions continuously */ #include #include #include // the inspector int check = 0; void MO(char *cmd) { if(check != 4) exit(0); printf("welcome to the MO!\n"); // olleh! system(cmd); } void YUT(void) { if(check != 3) exit(0); printf("welcome to the YUT!\n"); check = 4; } void GUL(void) { if(check != 2) exit(0); printf("wel..
[LOB] - giant -> assassin 풀이
[LOB] - giant -> assassin 풀이
2019.10.06/* The Lord of the BOF : The Fellowship of the BOF - assassin - no stack, no RTL */ #include #include main(int argc, char *argv[]) { char buffer[40]; if(argc < 2){ printf("argv error\n"); exit(0); } if(argv[1][47] == '\xbf') { printf("stack retbayed you!\n"); exit(0); } if(argv[1][47] == '\x40') { printf("library retbayed you, too!!\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer)..
[LOB] - darkknight -> bugbear 풀이
[LOB] - darkknight -> bugbear 풀이
2019.10.06/* The Lord of the BOF : The Fellowship of the BOF - bugbear - RTL1 */ #include #include main(int argc, char *argv[]) { char buffer[40]; int i; if(argc < 2){ printf("argv error\n"); exit(0); } if(argv[1][47] == '\xbf') { printf("stack betrayed you!!\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); } 이번 문제는 필자가 좋아하는 RTL 공격이다. 스택의 주소를 사용할 수 없으므로 공유 라이브러리 함수를 사용해보자. bugbear 바이너리를 분석..