LEVEL 19
[level19] passcode : swimming in pink
(NO DRAG, NO PASSCODE)
hint의 소스코드를 분석해보자.
그리 어렵지 않은 소스코드이다. 이 문제는 level11과 아주 유사한 구성을 가지고 있지만 setreuid 함수가 존재하지 않아 쉘코드만 삽입하여 실행하면 그저 level18 권한의 쉘만 따질 것이다.
우선 tmp 디렉토리에 attackme 프로그램을 복제해주고, gdb를 통하여 attackme 프로그램의 메모리 구조를 살펴보자.
메모리 구조는 다음과 같다.
—————————— High Address
| ret(4) |
——————————
| sfp(4) |
—————————— ← ebp
| dummy(20) |
——————————
| buf(20) |
—————————— Low Address
문제 해결 과정은 다음과 같다.
- buf(20) + dummy(20) + sfp(4) = 44 만큼을 NOP로 덮어야 한다.
- 그 뒤의 ret 주소를 setreuid 주소 + shellcode 삽입 주소 + ruid + euid 로 덮어주어야 한다.
- setreuid(uid_t ruid, uid_t euid) : uid_t ruid(real id, 누구로 로그인 했는가), uid_t euid(effective id, 나의 권한이 무엇인가)
우선 setreuid 함수의 주소부터 찾아주자.
우선 함수를 찾기 위하여 gdb에서 main의 시작점부터 bp를 걸어주고 실행을 시킨뒤에 setreuid 함수를 찾아보자.
setreuid 함수의 주소 → 0x420d7920
그리고 shellcode를 export 해주고 주소를 알아내자.
export 해준 SHELLCODE의 주소를 출력하는 프로그램을 만들고,
컴파일하여 실행한다.
SHELLCODE의 주소 → 0xbffffc15
그리고 setreuid 함수의 인자로 사용할 level20의 uid를 얻자.
- grep 명령어 : 특정 문자열을 찾고자 할 때 사용
이제 문제를 해결해보자.
[level20] : we are just regular guys
'Pwnable > FTZ' 카테고리의 다른 글
FTZ - level20 [Format String Bug] (0) | 2020.08.28 |
---|---|
FTZ - level18 [Buffer Overflow 𝜽] (0) | 2020.08.28 |
FTZ - level17 [Buffer Overflow 𝜼] (0) | 2020.08.28 |
FTZ - level16 [Buffer Overflow 𝜻] (0) | 2020.08.28 |
FTZ - level15 [Buffer Overflow 𝜺] (0) | 2020.08.28 |