Level16로 접속해서 항상 그렇듯이 파일 목록과 hint를 확인해 보도록 하겠습니다.

 

가볍게 코드에 대해서 짚고 넘어가면,

Level17의 권한으로 쉘을 띄워주는 shell()함수가 선언 되어 있고, “Hello there!”라는 문장을 출력해주는 printit()함수가 있네요.

main에서는 *call이라는 포인터 변수에 printit의 주소값을 넣어 주었구요.

이로 인하여 call()하였을 때 printit함수가 호출되게 됩니다.

쉘을 띄우려면 shell() 함수를 호출해야하니 call 포인터 변수에 shell()의 주소값을 넣어 주면 될 것 같습니다.


우선 gdb로 어셈블리어를 확인해 보도록 하겠습니다.

shell함수와 printit함수는 다음과 같구요.


 

Main은 다음과 같습니다.

<main+6>을 보면 ebp-160x8048500을 넣는 것을 확인 할 수 있는데요. 위에서 알 수 있듯이 0x8048500printit 함수의 시작지점입니다.

우리가 원하는 건 shell함수이니 ebp-16shell함수의 시작 주소 0x080484d0을 넣어주면 됩니다.

Fgets 함수는 ebp-56지점부터 입력을 하니 ebp-16에 원하는 값을 넣기 위해서는 40byte를 채우고 0x080484d0을 넣어주면 될 듯 하네요.


예상대로 값을 입력하도록 하겠습니다.


맞았네요. 정상적으로 level17의 쉘이 획득 되었습니다.

Level17의 패스워드는 king poetic입니다.

맥에서만 하다가 오늘은 윈도우에서 하네요. ㅎㅎ


Level15로 접속하고 hint를 확인해 보겠습니다.

Level14의 힌트와 굉장히 유사합니다.

참고로 Level14의 힌트는 다음과 같습니다.

Level15에서는 Level14에 비해서 check변수가 포인터 변수로 변경 되었다는 점만 다르네요.

따라서 Level14에서는 check에 직접 0xdeadbeef를 넣어 주었지만, Level15에서는 check0xdeadbeef가 들어있는 메모리의 주소값을 넣어 주어야 합니다.

 

코드에 deadbeef가 있으니 따로 입력은 하지 않고 저 값이 있는 주소를 얻어오면 될 듯 합니다.

Gdb로 열어서 값을 확인해 보도록 하겠습니다.

x/10x mainmain으로부터 40byte 만큼의 메모리 내용을 16진수로 보여달라는 명령어 입니다.

확인해보니 0x080484b20xdeadbeef가 있네요.

 

스택에서 *check의 위치를 알기 위하여 어셈블리어를 확인해 보겠습니다.

Level14와 스택구조가 똑같음을 알 수 있습니다.

그럼 40byte를 채워주고 그 다음 4byte*check이니깐 이 부분에 0x080484b2를 넣어주면 되겠네요.

빙고~ Level16 쉘이 획득 되었습니다.



Level16의 암호는 about to cause mass 입니다.



 

Level14로 로그인하고 hint를 확인해 줍시다.

fgest를 통해 사용자로부터 입력을 45개 만큼 받아오고, check부분이 0xdeadbeef라면 조건을 통과해 level15권한의 쉘을 띄워주는 코드네요.

 

어셈블리어 코드를 한번 확인해 봅시다.

56byte 만큼의 스택을 잡고, 4byte를 추가로 잡아주네요.

Fgest를 통해 받아온 입력값은 ebp-56에 저장이 되구요.

Ebp-16deadbeef라면 조건을 통과하네요.

필요한 정보는 다 획득한 듯 싶습니다.

스택을 그려보면 다음과 같이 됩니다.

dummy (4byte)

crap (4byte)

dummy (4byte)

check (4byte)

dummy (20byte)

buf (20byte)

Buf에 값을 입력해서 40byte를 채우고 check0xdeadbeef를 입력하면 끝나네요.

Fgest도 딱 맞춰서 45자를 입력받고 있습니다. 44가 아니고 45인것은 뒤에 개행문자 1byte가 포함 되기 때문입니다.

 

40개의 A0xdeadbeef를 넣어주도록 하겠습니다.

어렵지 않게 level15의 쉘을 획득할 수 있었네요.


level15의 암호는 guess what입니다.

+ Recent posts