힌트를 보게 되면 blef 라는 배열을 80만큼 선언하고 gets 로는 79만큼 입력을 받습니다.이 부분을 통해 우리는 ret을 변조할 수 없다는 것을 알 수 있습니다. 그래서 Buffer over flow 기법과 양대산맥인 Format String Bug 라는 취약점을 이용해서 풀어보도록 하겠습니다! printf 함수에서 값을 가져올 때 printf(“%x”, num); 이렇게 코드가 작성되어 있다면 변수 num의 주소 임시버퍼에 저장하고 저장된 주소를 참조해서 값을 가지고 오게 되는데 printf(bleh); 이런식으로 코드가 작성되어 있고 bleh에 형식지정자, 즉 Format String이 존재하면 bleh의 주소 다음부터 순서대로 pop된 값이 나오게 됩니다. 예제를 보시겠습니다. AAAA를 입..
코드가 많이 짧네요. 근데 권한을 상승시켜주는 코드인 setreuid(geteuid(), getreuid()) 가 없네요. 이럴 땐 setreuid 가 포함되어 있는 쉘코드를 사용하면 됩니다. gdb로 파일을 까서 공간을 얼마나 확보하는 지 확인해 보면 버퍼의 크기와는 다르게 40byte만큼 확보해주네요. setreuid가 포함되어 있는 쉘 코드를 사용해서 환경변수를 만들어줍니다. 환경 변수의 주소를 구하는 코드를 작성해 줍니다. 컴파일 해주고 실행시켜준 다음에 0xbfffcc1b 가 환경 변수의 주소란 것을 알게 되었습니다. 스택 구조에 맞게 payload 를 작성해 줍니다.
코드가 많이 기네요. 대충 보니까 우리의 목적은 check 를 deadbeef 로 만들어서 shellout 함수를 실행하는 것이네요! 스택의 구조를 살펴볼게요. 선언된 변수에 순서에 따라서 이런식으로 스택의 구조가 잡히게 됩니다. 여기서 말하고 싶은 점은 우리는 check 부분에 그냥은 접근을 못한다는 것입니다. 따라서 case 0x08 의 count--; 를 이용해서 buffer-4 부분에 접근을 해야하는 것이죠. 아무것도 입력하지 않은 상태에서는 string[count]가 buffer의 시작부분을 가리키고 있을 것입니다. 하지만 0x08을 4번 입력해주면? string[count]가 check의 부분을 가리키고 있겠네요! 이런식으로 0x08을 4번 출력후, deadbeef를 넣어주는 payload를 ..
힌트 봐요 !-!오오.. Level15의 포인터변수와 다르게 이번엔 함수포인터가 선언되어 있군요!! 함수 포인터란? 쉽게 생각하면 함수를 가리키고 포인터라고 생각하시면 됩니다! 함수포인터 call에 printit함수의 주소를 넣어주고 있는거 같군요!! 그리고 아래에 call 포인터를 호출하는 것을 볼 수 있습니다. 이것으로보아 우리는 함수포인터 call의 주솟값을 shell함수의 주솟값으로 바꾸면 되겠다는 것을 알 수 있습니다!바로 복사 ~gdb 돌려용브레이크 포인트를 아무데나 걸어주고!실행-!p 함수의 주솟값을 알아내면!!이런식으로 페이로드를 짤 수 있겠죠-! 메모리 구조에 대한 이해가 부족하다면... Level14를 보고오세요!_!땋
1. FTZ Level14를 보지 않으셨다면 보고오시는 것을 추천드립니다. 바로 힌트보겠습니다. 어 보니깐 level14와 비슷한 코드인데 check 변수가 포인터로 바뀌어 있네요! 자 포인터가 무엇인지 설명드리겠습니다. ㅂ니다 포인터란? 포인터(pointer)는 프로그래밍 언어에서 다른 변수, 혹은 그 변수의 메모리 공간주소를 가리키는 변수를 말합니다. 포인터가 가리키는 값을 가져오는 것을 역참조라고 합니다. 예를 들어 int crap 의 주소가 0xbfff7ea4 이고 int *check에 이 주소를 넣어주면 *check는 변수crap을 가리키게 되는 것이고 check는 변수crap의 주소, 즉 메모리 공간주소를 가리키게 되는 것입니다. 그러니까 코드에서 *check가 0xdeadbeef 인지 아닌지..
1. 야매로 풀고 계시다면 Level11부터 보고오세요 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 자 힌트 부터 볼게요!흠 코드를 해석해보니 check 의 값이 deadbeef 면! /bin/sh 즉 쉘권한이 획득 되는 코드네요! 복사하고 바로 gdb로 메모리 구조 분석하러 가겠습니다.메모리 구조를 파악하는데 핵심적인 부분만 분석해보겠습니다. sub esp, 0x38 : 56만큼의 공간을 만들어줍니다. cmp [ebp-16],0xdeadbeef : ebp-16부분에 deadbeef와 같은지를 비교 합니다. 자! 여기서 알 수 있는 부분은 전체의 공간은 56byte이고 if(check == 0xdeadbeef) 이 코드가 cmp [ebp-16],0xdeadbeef 를 의미하므로 ebp-16이 check변수의 시작 주소임을 알 수 ..
1. 환경 변수에 대한 이해가 되지 않으셨다면, Level 11(Env) 편을 보고 오세요.바로 cat hint ~ 코드 분석 i에 0x1234567이 들어가고 만약에 i가 처음에 넣어준 0x1234567과 다르다면 프로그램을 종료시켜 버린다는 것을 알 수 있습니다!코드 분석을 했으면 gdb로 프로그램의 메모리 구조를 살펴봐야겠죠? 바로 복사해줍니다.눈 아프죠.. 메모리 구조를 아는 데에 핵심적인 곳만 해독해 보겠습니다. 에서 0x418만큼 공간을 확보해주고 있습니다. 그리고 바로 아래 에서 ebp-12에 4바이트 0x1234567을 넣어주는 것을 알 수 있습니다. 이 부분에서 저희가 알 수 있는 부분은 ebp-12는 변수 i의 시작 주소라는 것입니다!그렇다면 위 그림처럼 메모리 주소를 나타낼 수 있겠지..
1. 환경변수가 뭔지 모르신다면 Level 11(Env)편을 보고오세요 오오.. 벌써 12렙이네요!! 자 바로 힌트~흠... 11렙 힌트랑 비슷한거 같은데 한번 gdb로 까봐요!! 헉.. 메모리 구조까지 똑같네요... 하지만 여기서 다른 점이 하나 있습니다! 바로 프로그램이 사용자에게 값을 받을 때 argv,argc 로 받지 않고 gets 함수를 사용하여 값을 받는 다는 것입니다! 저는 환경변수를 사용하여 문제를 간단하게 풀어보겠습니다! 사실 이문제의 목적은 여러기법을 통해서 푸는 것도 좋겠지만 get함수같은 라이브러리 함수로 값을 받을 때 값을 넘겨주는 방법을 아는것이 목적인 것 같습니다! 자 값을 넘겨주는 방법을 알기전에 환경변수부터 만들겠습니다!! 환경변수를 만들었으니 환경변수의 주소를 찾아내는 코..
1. 앞에 NOP Slad 와 환경변수를 보고오지 않으셨다면 보고오시는 것을 추천합니다! 2. 보고 오셨다면 FTZ Level11번의 메모리 구조에 대해선 이해하셨다는 전제하에 시작하겠습니다. 본격적으로 설명을 시작하기 전에 RTL이 무엇인지, 그리고 어떨때 사용해야하는지를 설명하겠습니다. RTL(Return To Library ) 이란? return address 를 조작하여 실행의 흐름을 공유라이브러리 영역에 있는 원하는 함수로 바꿔 수행하게 하는 것입니다. RTL을 사용하는 이유? DEP(Data Execution Protection)라는 방어기법 때문에 RTL을 사용하는데 DEP란 스택,힙 같은 영역에 있는 코드가 w권한 x권한을 동시에 갖지않도록 차단하는 기법입니다. 우리가 일반적으로 공격을 할..
- Total
- Today
- Yesterday
- succubus
- angry_doraemon
- 파이썬
- bugbear
- babypwn
- HarekazeCTF
- Pwnable.kr
- 올리디버거
- 클래스
- ftz
- babyheap
- OllyDbg
- orge
- lob
- picoctf
- 포너블
- C언어
- Nightmare
- TAMUCTF
- 0ctf
- 리버싱
- 비교 연산자
- protostar
- darkknight
- zombie_assassin
- Python
- Golem
- Codegate
- BaskinRobins31
- luckyzzang
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |