[FTZ] Level 14

2021. 2. 15. 12:10FTZ

[ Level 14 ]

level14 로그인

ID : level14

PW : what that nigga want?


이번에도 힌트에 attackme의 소스코드가 있다.

소스코드에서 system("/bin/sh"); 가 있으니 환경변수를 만들 필요는 없다.

 

힌트에 있는 소스코드를 복사해서 tmp에 attack이라는 이름의 파일을 만들어 붙여 넣어 준 뒤,

gcc명령어를 이용하여 실행파일을 만들어 준다.

gdb로 attack 실행파일을 실행시키고, set disassembly-flavor intel을 입력하여 어셈블리 문법을 intel로 설정해주고,

disass main을 입력하여 main함수를 어셈블리 코드로 출력하도록 하였다.

위 어셈블리 코드를 보면, "sub    esp, 0x38"로 변수를 선언할 공간을 만들어 주었다. (53byte 공간 생성)

C언어 코드에서는 int형 변수 2개와 char형 배열 20byte만큼만 선언하였으나(4byte*2 + 20byte = 28byte),

어셈블리에서는 53byte의 공간을 만들었다. 이는 변수와 변수 사이에 dummy 공간이 있다는 것을 의미한다.

 

fgets함수의 매개변수에는 buf, 45, stdin이 들어가는데, 먼저 ds:0x80495d0(stdin)을 push 하고,

다음으로 0x2d(45)를 push, 마지막으로 [ebp-56](buf)의 주소를 push 하였다.

따라서 buf는 스택 메모리의 [ebp-56]에 위치해 있다는 것을 알 수 있다.

 

"cmp    DWORD PTR [ebp-16], 0xdeadbeef"로 [ebp-16]과 0xdeadbeef를 비교하고 있다는 것을 알 수 있고,

( cmp(Compare)는  두 피연산자를 비교하는 작업을 한다. ) 

C언어 코드에서의 if문과 같은 역할을 한다고 볼 수 있다.

따라서 [ebp-16]check를 가리킨다는 것을 알 수 있다.

 

buf와 check는 40byte의 차이가 나므로, fgets로 buf에 입력을 받을 때,

40byte까지는 "\x90"을 입력하고, check에 0xdeadbeef를 넣어주면 if문에 걸리게 되어

level15의 권한으로 /bin/sh를 실행할 수 있을 것이다.

 

테스트를 위하여 tmp에서 만들어둔 attack 실행파일에서 실행한다.

(python -c 'print "\x90"*40 + "\xef\xbe\xad\xde"'; cat) | ./attack을 입력해준다.

whoami를 입력해보니 level14(로그인한 사용자)가 출력이 된 것을 확인할 수 있다. ( 종료하려면 ctrl + c )

성공적으로 실행이 되었다.

 

이제 직접 attackme를 실행시킨 후, my-pass를 입력하여, level15의 Password를 알아내면 된다.


[ Level 14 Clear ]

'FTZ' 카테고리의 다른 글

[FTZ] Level 16  (0) 2021.02.15
[FTZ] Level 15  (0) 2021.02.15
[FTZ] Level 13  (0) 2021.02.15
[FTZ] Level 12  (0) 2021.02.15
[FTZ] Level 11  (0) 2021.02.15