2021. 2. 15. 12:10ㆍFTZ
[ 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 |