일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 이진 탐색
- 이분 탐색
- 투 포인터
- 이진트리
- House of Orange
- 분할 정복
- ROP
- 큐
- 백트래킹
- 완전 탐색
- 스위핑 알고리즘
- 문자열 처리
- DFS
- 에라토스테네스의 체
- 스택
- syscall
- off by one
- tcache
- fsb
- 브루트 포스
- 포맷스트링버그
- BFS
- 수학
- heap
- OOB
- 다이나믹 프로그래밍
- BOF
- 동적 계획법
- 연결리스트
- RTL
- Today
- Total
목록포맷스트링버그 (5)
SDJ( 수돈재 아님 ㅎ )
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/FhaQ8/btqA2anmKwa/OMuFaQU6JMW7GJJN9HZhck/img.png)
보호기법은 Full RELRO, Canary, NX가 켜져있다. 바이너리를 분석해보자. 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 int __cdecl main(int argc, const char **argv, const char **envp) { int result; // eax unsigned __int8 v4; // [rsp+6h] [rbp-6Ah] unsigned __int8 i; // [rsp+7h] [rbp-69h] char *format; // [rsp+8h] [rbp-68h] char v7[80]; // [rsp+10h..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bsJDVB/btqARiTHIUn/nAeyEz3Qxso3dvBQEDw4sK/img.png)
바이너리의 보호기법은 Partial RELRO, Canary, NX가 걸려있다. 바이너리를 분석해보자. 먼저 main을 보면 func01() func02(&v4, 0x40) func03(&v4) 순으로 작동하는 것을 알 수 있다. func01()은 별거 없고 func02()를 보자 간단하다. fgets함수를 사용해서 a1에 a2길이 만큼 입력을 받는다. a1과 a2는 각각 a1 --> v4 // [rbp - 0x50] a2 --> 0x40 이라서 overflow는 발생하지 않는다. 다음 func03() FSB가 터진다. 맨 처음 __stack_chk_fail를 호출해서 loop를 도는 방법을 생각했지만 overflow가 없기 때문에 다른 방법을 찾아야 했다. 그래서 puts의 got를 바꿨다. ( 전에 ..
![](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/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파일이 적혀있는 것을 볼 수 있다. 따라서 파란색 인자의 위치인 ..