2017/01/11 - [Study :)/FTZ] - [해커스쿨] FTZ level14 풀이과정
level14(http://eunice513.tistory.com/59)랑 매우 흡시하지만.. 이번엔 check라는 변수가 포인터이다. 이것만 다르고 다 똑같다.
gdb로 파헤쳐보자~
0x38(56byte)만큼 공간 할당하고... 사용자로 부터 입력받은 값을 [ebp-56]에 저장하고..
[ebp-16]의 주소를 eax에 넣어서 , eax에 있는 주소의 접근한 값이 "0xdeadbeef"인지 확인..
맞으면 setreuid를 실행...
일단, 사용자로부터 입력받은 값은 [ebp-56]이고, "0xdeadbeef"의 주소가 들어있는 값은 [ebp-16]이니까, 40byte만큼 떨어져있다는것을 확인 할 수 있다.
<main+36>에 BP를 걸고 돌려보자.
사용자로 부터 입력받은 값이 들어가는 [ebp-56]의 주소값은 "0xbffff8a0"
40byte만큼 떨어진곳의 [ebp-16]의 주소값은 "0xbffff8d8"
즉, 우리가 확인해야 되는것은, check라는 변수가 포인터로 선언되었기 때문에, [ebp-16]에 있는 주소값을 참조해서 그곳에 "0xdeadbeef"값이 있는지 확인해야 된다.
그래서, [ebp-16]("0xbffff8a0")에 있는 주소값을 따라가보니, "0xbffff8f8"이라는 엉뚱한 값이 들어있다. 이곳에 "0xdeadbeef"라는 값이 들어있으면 끝난다.
우린 힌트를 통해서 메인함수 안에 "0xdeadbeef"라는 값이 선언되었음을 알 수 있다.
<표식 1>
예상대로, main함수가 있는 곳에 "0xdeadbeef"라는 값이 들어있다. 그리고 "0x80483e4"라는 주소이라는 것도 확인 할 수있다.
그렇다면, [ebp-16]에 "0x80483e4"를 집어 넣으면, [ebp-16]을 참조하면 "0xdeadbeef"가 나오기 때문에 해결될 것 같다.
<표식 2>
<표식 2>을 보면 "0x80484b2"라는 주소값을 넣고 있는데, <표식 1>까지의 풀이 흐름으로는 "0x80483e4"를 넣어야 된다.
<표식 2>에서 "0x80484b2"를 넣은 이유는 필자가 블로깅 할때는
/home/level15/tmp 안에 attackme파일을 만들어서 분석하고, 실제 공격은 /home/level15안에 있는 attackme 파일을 공격하기 때문에, 주소값이 다른것이다.