-
[FTZ Level15 풀이]System/FTZ 2018. 2. 16. 19:50
[Level15 Code]
1234567891011121314#include <stdio.h>main(){ int crap;int *check;char buf[20];fgets(buf,45,stdin);if (*check==0xdeadbeef){setreuid(3096,3096);system("/bin/sh");}}cs 문제는 Level14와 매우 흡사하다.
다른 점이 있다면, check변수가 포인터변수로 변했다는 점이 있다.
어셈블리에서는 어떻게 달라졌는지 한번 보도록 하자
[Level15 Assemble]
보면, [EBP-16]공간에 있는 4Byte를 EAX에 저장하고
[EAX]에 있는 4Byte를 deadbeef와 비교한다.
여기서 우리가 주목해야 할 점은 [ ]의 의미이다.
CMP부분에서 EAX의 대괄호가 없었다면, 그냥 [EBP-16]공간에 deadbeef를 넣어주면 된다.
하지만 대괄호가 있으면 값을 참조하는 개념이 달라진다.
DWORD PTR [EAX] = EAX에 저장되어 있는 주소에 저장되어 있는 4Byte를 참조하겠다.
라는 의미가 되어버린다.
따라서, 우리는 deadbeef가 저장되어 있는 주소를 [EBP-16]에 저장해줘야 한다.
objdump로 deadbeef가 어디에 저장되어 있는지 확인해보자
[0x080484b2]에 deadbeef가 저장되어 있는 것을 확인할 수 있다.
그럼 저 주소를 스택에 저장해주면?
보는것 처럼 쉘이 실행된 것을 확인할 수 있다.
이제 Level16으로 넘어가보자
'System > FTZ' 카테고리의 다른 글
[FTZ Level17 풀이] (0) 2018.02.16 [FTZ Level16 풀이] (0) 2018.02.16 [FTZ Level14 풀이] (0) 2018.02.16 [FTZ Level13 풀이] (0) 2018.02.16 [FTZ Level12 풀이] (0) 2018.02.15 댓글