코드가 많이 짧네요. 근데 권한을 상승시켜주는 코드인 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)편을 보고오세요 오오.. 벌써 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권한을 동시에 갖지않도록 차단하는 기법입니다. 우리가 일반적으로 공격을 할..
바로 hint를 봐주겠습니다!level11 폴더에서는 권한의 제한이 있어서 권한 제한이 없는 tmp로 복사하여 gdb로 까봅시다!0x108 만큼 공간을 확보하네요!!버퍼가 256byte 인것을 감안하면 메모리 구조는 아래 사진처럼 되겠네요! 우리는 환경변수를 이용하여 문제를 풀 것이기 때문에 RET 만 중심적으로 보면 됩니다! RET이란 함수가 명령을 끝내고 실행할 다음 명령의 메모리 주소입니다!! 감이 오시나요? 우리는 이 RET을 쉘코드가 포함 되어 있는 환경변수의 주소로 바꾸면 된답니다!!!! 이런 혁명이!! 바로 환경변수를 만듭시다. 여기서 $이런건 환경변수 만들 때의 문법 같은것이라고 보셔도 무방합니다! 그리고 여기서 앞에 \x90 즉 NOP을 3만개나 때려박는 이유는! 앞에 NOP Slad 에..
hint를 보면 Buffer Over Flow를 사용하여 푸는 문제네요!!한번 풀어보도록 하겠습니다.level 11 폴더에서는 쓰기 권한이 없으므로 tmp폴더로 복사 시켜 주기로 할게요!gdb 라는 디버거를 사용하여 프로그램을 까주면!호오.. 이 어셈블리 코드를 분석해본 결과 아래 그림처럼 메모리 구조가 생기겠네요!sub 0x108로 264만큼의 공간을 생성하는데 버퍼의 크기는 256이니 8바이트 만큼의 더미가 생겼겠네요!Nop Slad를 사용하여 문제를 풀것이기 때문에 버퍼의 시작주소를 알아야 하는데 여기서 Nop Slad 란?프로그램이 프로그램을 실행하다가 명령을 받으면 명령을 처리하죠! 여기서 명령을 NOP으로 주게되면 프로그램이 아무일도 하지않고 다음 명령으로 넘어가는데 이때 그다음 명령도 NOP..
- Total
- Today
- Yesterday
- luckyzzang
- angry_doraemon
- 클래스
- babyheap
- Golem
- TAMUCTF
- OllyDbg
- picoctf
- HarekazeCTF
- protostar
- bugbear
- Nightmare
- Codegate
- 0ctf
- 포너블
- ftz
- 리버싱
- darkknight
- 비교 연산자
- Python
- lob
- BaskinRobins31
- C언어
- 파이썬
- babypwn
- Pwnable.kr
- succubus
- zombie_assassin
- orge
- 올리디버거
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |