-
해커스쿨 ftz level18System/HackerSchool ftz level 2019. 7. 8. 01:53
소스코드가 쓸데없이 길어서 풀기 힘들었던 level18입니다.
근데 사실 긴 소스코드 치고는 쉬워요 어차피 0xdeadbeef랑 비교하는 문제라서
일단 이 shellout 함수가 uid를 변경해주는 역할을 하구요
check값이 0xdeadbeef가 되면 shellout 함수가 실행되니까 check값만 어케 잘 해주면 될듯 하네요
근데 코드가 긴만큼 디버깅할 때도 뭔가 길어요
근데 중요한 부분만 짚으면 딱히 길진 않으니 짚어보자면 <main+91>에 [ebp-104]와 0xdeadbeef를 비교하는 부분이죠
여기서 당연히 [ebp-104]의 값은 저장된 check값일 거구요, 그럼 ebp로부터 104바이트 떨어진 곳에 check가 있는 것을 확인할 수 있습니다
그 다음에 바로 shellout 함수를 실행시키니 저 부분이 무한루프 직후에 나오는 명령이라 확신할 수 있겠죠
이제 <main+481>을 보면 dec 명령어가 나왔으므로 case 0x08; 뒤 count--; 부분임을 확인할 수 있죠
즉 count는 ebp로부터 112바이트 떨어진 곳에 있고, <main+499>를 보면 string이 ebp로부터 100바이트 떨어진 곳에 위치한다는 것을 알 수 있습니다.
메모리 구조를 그려본다면
RET + SFP + string[100] + check[4] + dummy[4] + count[4] + dummy[136] + x[4] + fds[4]
가 되겠는데, 그러면 string배열에 값을 넣는걸로는 check값을 변경할 수 없으니 string에 음수값을 넣어서 메모리상 낮은 주소로 올라갈 수 있을 것 같습니다
사실 저 부분 이해 잘 안갔습니다
그래서 나중에 다시 풀어볼 생각인데 지금 말구요 일단 딴거 풀거에요
'System > HackerSchool ftz level' 카테고리의 다른 글
해커스쿨 ftz level20 (0) 2019.07.09 해커스쿨 ftz level19 (0) 2019.07.08 해커스쿨 ftz level17 (0) 2019.06.15 해커스쿨 ftz level16 (0) 2019.06.15 해커스쿨 ftz level15 (0) 2019.06.14