ID : level18
PW : why did you do it
1.
level18에 로그인 한 뒤, hint 파일을 열었다. 그 동안과 다르게 복잡해보이는 코드가 있다.
대충 해석해보니, check변수가 0xdeadbeef가 되면 shellout함수가 실행돼 쉘을 딸 수 있을 것 같은데...
그런데 그동안 해왔던 것처럼 string을 넘치게 하여 check에 죽은 고기를 넣는 방법은, 이번에는 string버퍼가 맨 위에 존재하기 때문에 안 될 것 같다.
이 코드에서 키포인트는 0x08 입력이 들어오면 버퍼의 문자수를 조절해주는 count 변수가 1감소하게 된다는 점이다.
그렇다면 배열의 인덱스가 -가 되도록 하면 앞의 메모리에 접근이 가능하게 될 것이다.
즉, string[100]보다 나중에 존재하는 check변수에 접근이 가능하다는 것이다. (추후수정)
-코드해석-
fflush(stdout) 버퍼를 청소해줌 ((버퍼 = 데이터를 임시로 저장하는 곳)
어떻게 문제를 해결할지 생각해보자.
- string[100] 에서부터 check까지의 거리 구하기
- check변수를 0xdeadbeef로 덮는 페이로드 작성하기
우선, string에서 check까지의 거리를 구하기 위해 디버깅 해주자!
코드가 긴만큼 디버깅출력도 길다. (엔터치면 계속 나옴)
<main+91> cmp DWORD PTR [ebp-104], 0xdeadbeef 부분을 보면, check부터 ebp까지의 거리가 104임을 알 수 있다.
<main+499> lea eax,[ebp-100] 부분을 보면, string[100]부터 ebp까지의 거리가 100임을 알 수 있다.
즉, string변수에서부터 check까지의 거리 = 100 - 104 = -4이다.
추측한대로 check의 위치가 string보다 앞에 있다.
이제 페이로드를 작성해보자!
기본적인 페이로드는 [string에서부터 check까지의 거리] + [0xdeadbeef값] 이다.
여기서 주의할 점은 string에서부터 check까지의 거리인 -4는 0x08을 입력하면 버퍼의 문자수를 조절해주는 count변수가 1 감소되는 것을 이용하여 역으로 돌아가는 방법을 사용해야 한다. (추후수정)
따라서, 최종적인 페이로드는
(python -c 'print "\x80"4 + "\xep\xbe\xad\xde"''cat)|./attackme
쉘을 땄다.
(2020.02에 작성한 글을 가져왔습니다.)
'Pwnable > FTZ' 카테고리의 다른 글
[FTZ] level 20 풀이 <FSB> (0) | 2024.01.18 |
---|---|
[FTZ] level 19 풀이 <BOF> (0) | 2024.01.18 |
[FTZ] level 17 풀이 <BOF-env> (0) | 2024.01.18 |
[FTZ] level 16 풀이 <BOF-함수 덮기> (0) | 2024.01.18 |
[FTZ] level 15 풀이 <BOF-포인터> (0) | 2024.01.18 |