일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 문자열 처리
- 에라토스테네스의 체
- OOB
- House of Orange
- 투 포인터
- ROP
- 이진 탐색
- 이진트리
- 이분 탐색
- 브루트 포스
- 백트래킹
- BFS
- 완전 탐색
- 다이나믹 프로그래밍
- 포맷스트링버그
- 스택
- BOF
- 수학
- DFS
- 큐
- heap
- 분할 정복
- off by one
- syscall
- tcache
- RTL
- 동적 계획법
- fsb
- 스위핑 알고리즘
- 연결리스트
- Today
- Total
목록write-up/pwnable (43)
SDJ( 수돈재 아님 ㅎ )
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ckzhNT/btqz6G8N9rh/z7z8B250EkfO3j2ulYKTRK/img.png)
예전에 이 바이너리를 봤었는데.. 그 때 당시에는 heap에 대해 몰랐기 때문에 house of orange 기법도 몰랐고 그냥 넘겼던 문제였다. 근데 이번에 house of orange 기법을 좀 공부하고 싶어서 다시 꺼냈다.. 차근차근 exploit 해보자. 먼저 보호기법이다. main을 보면 다음과 같다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { int v3; // [rsp+4h] [rbp-Ch] unsigned __int64 v4; // [rsp+8h] [rbp-..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/eb2JaA/btqzT51P0HQ/zrFRFjlHWf8HkYyNHKLkWk/img.png)
한양대학교 Open CTF이길래 재미삼아 도전해 봤다. 아름답다. 제공해준 libc파일이 2.27이라서 우분투 18.04에서 풀었다. main함수는 다음과 같다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 int __cdecl main(int argc, const char **argv, const char **envp) { char *v3; // rdx int v5; // [rsp+8h] [rbp-118h] int buf; // [rsp+Ch] [rbp-114h] char v7; // [rsp+10h] [rb..
보호되어 있는 글입니다.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bdHd5X/btqzu68aB5X/YEGCsNB5zvTFq6CEcBoFDk/img.png)
오랜만에 write-up을 쓰고자 한다. 오늘은 2019 facebook ctf - otp-server인데 먼저 보호기법부터 보자. 아름답다. 그럼 바로 바이너리를 분석하러 가보자. main함수는 다음과 같이 생겼는데 하나씩 살펴보도록 하자. 1. sub_9E8 /dev/urandom에서 랜덤한 값을 꺼내온 다는 것 말고 중요한 점은 보이지 않는다. sub_9E8속에 sub_9BA를 보면 설명을 해준다. cipher( (4 byte nonce | message | 4 byte nonce) )방식이라고 한다. 2. sub_C4A ( 취약점 발생 함수 ) main함수에서 v4인자가 넘어온다. IDA에서 함수의 이름을 내 입맛 대로 바꿔버린점 주의. 여기서는 두가지로 나뉘게 되는데 1번 -> Set key와 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/A60y1/btqyUJ52Xnf/7cfBNlMJkXKk7TZxrEhqAK/img.png)
64bit에 Full RELRO, Canary, NX 활성화 되어있다. 주어진 libc가 2.27이고 tcache문제기 때문에 ubuntu 18.04로 풀었다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 from pwn import * p = process('./aria-writer-v3') def choice(idx): p.sendlineafter("> ", str(idx)) def alloc(size, c..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cgotju/btqyWLhukQl/TYXZTA8ktCfgS3x7lCRck0/img.png)
64bit에 Partial RELRO, Canary, NX가 활성화 되어있다. 주어진 libc가 2.27이므로 tcache문제라서 Ubuntu 18.04로 풀었다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 from pwn import * p = process('./aria-writer') def choice(idx): p.sendlineafter("pls > ", str(idx)) def alloc(size, content..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/LOnIG/btqyRN70yRI/8inWKsQu4eVppZFtU01MyK/img.png)
이번엔 PwnThybytes CTF의 babyfactory를 풀어보려고 한다. 64bit에 모든 보호기법들이 걸려있다. 사용할 수 있는 메뉴들은 다음과 같이 5가지 정도 있다. 하나씩 분석해보자. 1. create 먼저 create다. 여기서 두가지 경우를 선택할 수 있는데 하나는 Boy, 다른 하나는 Girl이다. 함수 sub_C3B의 인자를 다르게 주는 것을 볼 수 있는데 함수를 분석해보자. 1-1) sub_C3B 함수의 일부다. 인자로 넘어온 값에 따라 두가지 경우가 생긴다. a1의 값이 참일 경우에는 malloc(0x69)를 하고 read(0, *v3, 0x69)를 한다. 참이 아닐 경우에는 malloc(0x68)을 하고 read(0, *v3, 0x68)을 한다. 여기서 취약점이 하나 존재하는데 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bajz7S/btqystCYfck/mXkectVc8oypAfvk9dDkx1/img.png)
32 bit에 Partial RELRO, Canary, NX가 활성화되어있다. IDA로 분석해보면 LOOPY #0와 다르게 Canary가 생겨서 ROP를 할 수 없게 됐다. BOF 한 번과 FSB 한 번으로 익스를 어떻게 해야 하나 생각을 하다가 다음과 같이 생각했다. FSB로 ___stack_chk_fail의 주소를 바꾼다면 canary가 바뀌어도 바뀐 ___stack_chk_fail함수가 실행될 것이다. 따라서 gets를 통해 ___stack_chk_fail의 got를 적고 포맷 스트링으로 그 주소를 vuln() 함수로 바꾼다면 무한 루프를 돌게 될 것이다. 마지막엔 원가젯을 마구 줘서 실행되게 했다. exploit code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/rWtXf/btqysezhilV/z7SCHGhM1HYCH0lV6GSw4k/img.png)
일단 2.28버전이라 로컬에서 돌리지 못했다. ( Ubuntu 16.04 LTS 라서 2.28이 아니었다.. ) 그래서 서버로 일일이 접속하며 풀었는데 꽤나 힘들었다. 먼저 32 bit 바이너리에 Partial RELRO, NX가 활성화 되어있다. IDA로 분석해보면 다음과 같이 vuln()함수에서 gets()함수로 BOF가 발생하고 format string buf ( FSB )도 발생하는 것을 볼 수 있다. 카나리가 존재하지는 않으므로 ROP를 통해 쉽게 익스가 가능할 것이라고 생각했다. exploit code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 from pwn import..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/BZf1A/btqyu85aArC/ElwN21FM6VkCEqUkGudDsk/img.png)
32 Bit 바이너리에 보호기법은 Partial RELRO가 걸려있다. IDA로 분석을 해보면 먼저 main에서 변수 v4에 0을 넣고 vuln()함수를 거친후 v4가 42가 된다면 win()함수를 출력하도록 되어있다. 이 때 vuln()함수에서는 Format String Buf ( FSB )가 발생하여 v4의 값을 조절할 수 있게 된다. 따라서 포맷스트링으로 v4의 값을 42로 바꾸면 win()함수가 실행될 것이다. v4 인자 위치를 알아내기 위해 gdb로 열어보자 그리고 다음 2 곳에 break pointer를 건다. 1. v4 에 0을 할당하기 직전 2. fsb가 발생하기 직전 먼저 v4에 0을 할당하기 직전 모습이다 ebp - 0xc에 0을 할당하는데 현재 ebp = 0xffffcfc8이므로 eb..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/b6klnd/btqysNnBwCN/cXdZzj44Kk4K3l9qXkuqKk/img.png)
32bit 바이너리에 Partial RELRO가 걸려있다. 처음 main()함수에서 flag파일을 읽어와 s에 적어준 뒤, vuln(); 함수를 실행시킨다. 그리고 vuln()함수에는 format string bug ( FSB ) 취약점이 존재한다. 따라서 포맷스트링을 이용해 main함수에서 flag를 적은 s를 출력해 주면 flag를 얻을 수 있다. 인자 위치를 찾기위해 gdb로 열어보자 먼저 가상 flag.txt파일을 만들어주었다. 그리고 포맷스트링 직전 인자값들을 확인하기 위해 FSB가 일어나는 printf 직전에 breakpoint를 걸어준다. 사진과 같이 파란색 0xffffcebc 위치에 우리가 입력한 AAAA... flag.txt파일이 적혀있는 것을 볼 수 있다. 따라서 파란색 인자의 위치인 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/Ho8yD/btqysMPJ1DQ/ZQdtrFRzbtOUmQakMfCxBK/img.png)
32bit 바이너리에 Partial RELRO만 걸려있다. 이번에는 win()함수에 인자 2개가 추가 되었다. __int64 al와 int a2인데 __int64 는 8byte이고 int는 4byte라고 알고있기 때문에 자료형에 맞게 인자를 보내줘야 겠다. 그리고 vuln()함수에서 bof가 발생하는데 이번에는 ret를 win으로 덮기만해서는 안되고 위에있는 인자를 덮어줘야할 필요가 있다. 따라서 RTL을 통해 win()함수를 실행 시키면 flag를 얻을 수 있다. exploit code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 from pwn import * #p = process('./bufover-2') p = remote("shell.2..