일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- heap
- off by one
- 수학
- DFS
- 이분 탐색
- 투 포인터
- 백트래킹
- BOF
- 큐
- 브루트 포스
- 스택
- 포맷스트링버그
- ROP
- 다이나믹 프로그래밍
- OOB
- 동적 계획법
- 분할 정복
- 에라토스테네스의 체
- RTL
- 스위핑 알고리즘
- House of Orange
- BFS
- 문자열 처리
- 이진 탐색
- syscall
- fsb
- 연결리스트
- 이진트리
- tcache
- 완전 탐색
- Today
- Total
목록write-up/pwnable (43)
SDJ( 수돈재 아님 ㅎ )
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cQJqoT/btqCynZWADX/lO4uOYyky9KO4XettkzOKK/img.png)
오랜만에 tcache 재밌게 풀게해준 문제.. 문제가 2.27 버전이길래 Ubuntu 18.04에서 풀었다. 보호기법은 전부 걸려있다. IDA로 바이너리를 분석해보자. 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 int __cdecl main(int argc, const char **argv, const char **envp) { __int64 v3; // rax int v5; // [rsp+14h] [rbp-Ch] setup(argc, argv, envp); v5 = 0; while ( !v5 ) { prompt(); v3 = get_long(); if ( v3 == 1 ) { add_person(); } else if ( ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cbjY1c/btqCylVpb0W/WEMvK7GBQXXqcNyJ8x6Wfk/img.png)
이래저래 고민을 좀 많이한 문제다... 마땅히 생각이 나지않아 노가다(?) 방식으로 쉘을 땄는데.. 다른 방법이 있는지는 찾아봐야겠다. 일단 이 글에서 사용한 방법은 return2csu방법을 사용했다. 보호기법은 Partial RELRO만 걸려있고 전부 꺼져있다. 바이너리를 분석해보자. 먼저 main을 보면 1 2 3 4 5 6 int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { welcome(); while ( 1 ) do_move(); } welcome()함수를 호출하고 while로 do_move()함수를 무한으로 호출하는 것을 볼 수 있다. welcome함수는 그냥 puts함수이므로 넘어가고, do_move()함..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cDrWYi/btqCAPgSqoa/m02EKwuyIBV25N1MVN3iO1/img.png)
보호기법은 Partial RELRO와 NX만 걸려있는 매우 간단한 문제이다. IDA를 열어서 main을 보면 1 2 3 4 5 6 7 8 9 int __cdecl main(int argc, const char **argv, const char **envp) { char v4; // [rsp+0h] [rbp-70h] puts("I really like strings! Please give me a good one!"); gets(&v4, argv); puts("Thanks for the string"); return 1; } gets 함수에서 BOF가 터지는 것을 볼 수 있고, 이것을 이용해서 쉘을 따면 된다. 익스플로잇을 하기 전에 바이너리 함수를 보다보면 다음과 같은 함수를 찾을 수 있다 1 2 3 4..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cvV6Vf/btqCl91vmJ0/tKg4BezLlM0KM2hRWqgQT1/img.png)
보호기법은 다음과 같다. 문제 자체는 몇몇 조건을 우회해서 쉘코드를 실행시키기만 하면 된다. 바이너리를 까보면 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 __int64 __fastcall main(__int64 a1, char **a2, char **a3) { _BYTE *v3; // rsi char *s; // [rsp+30h] [rbp-20h] void *dest; // [rsp+48h] [rbp-8h] sub_170F(); dest = (void *)sub_1695(128LL); v3 = calloc(0x80uLL, 1uLL); read(0, v3, 0x80uLL); byte_4088 = v3[127..
보호되어 있는 글입니다.
보호되어 있는 글입니다.
보호되어 있는 글입니다.
보호되어 있는 글입니다.
보호되어 있는 글입니다.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bwKKUi/btqBGZlxc8v/KpBJ3kTpFrEKV8HrAPcWHK/img.png)
보호기법은 다음과 Partial RELRO와 NX가 걸려있다. 바이너리를 분석해보자 speedrun 문제는 다 간단한 문제들이라 취약점은 쉽게 보인다. sub_400B60()함수를 보면 1 2 3 4 5 6 7 8 __int64 sub_400B60() { char buf; // [rsp+0h] [rbp-400h] sub_410390("Any last words?"); sub_4498A0(0, &buf, 0x7D0uLL); return sub_40F710((unsigned __int64)"This will be the last thing that you say: %s\n"); } BOF가 터지는게 보인다. 이 바이너리는 Dynamic linkingdynamically linked이 아니라 staticall..
![](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를 바꿨다. ( 전에 ..