2020/01
[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..
64bits 인자 값 전달 방식 순서
64bits 인자 값 전달 방식 순서
2020.01.28[Linux - ELF] Parameter 1 - rdi Parameter 2 - rsi Parameter 3 - rdx Parameter 4 - rcx Parameter 5 - r8 Parameter 6 - r9 Parameter 7 - (%rsp) Parameter 8 - 0x8(%rsp) system call - %rax
[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 비교하여..