ii4gsp
FTZ - Level18 본문
힌트를 보니 다른 문제와는 다르게 소스코드가 아주 길다.
count가 100이상이면 "what are you trying to do?"라는 문장을 출력한다.
check가 0xdeadbeef라면 shellout함수를 실행시킨다.
사용자로부터 입력을 받고 입력받은 값에서 1byte를 읽고
1byte의 값이 0x08이면 count 값을 -1한다.
byte값이 \r, \n, 0x08 모두 아니라면 string[count]에 입력한 1byte 값을 대입하고 count 값을 +1한다.
shellout함수는 쉘을 실행시킨다.
변수가 선언된 순서를보면 string변수가 먼저 선언되고 check변수가 선언되었다.
ret변조는 불가능하다 그래서 check값을 0xdeadbeef로 해줘야한다.
check변수가 string보다 더 낮은주소에 있으니 count를 음수로 만들어
string[-4]가된다면 check주소에 접근할 수 있을것이다.
gdb로 분석을 해보면 0xffffff98은 2진수로 1001 1000인데 1의 보수를 해주면 0110 0111 2의 보수를 해주면 +1이 되니 104가된다 ebp-104와 0xdeadbeef가 비교한다.
ebp-104는 check임을 알 수 있다.
inc는 +1을 해주니 default 부분일것 이다.
<main+499>에서 0xffffff9c는 2진수로 1001 1100인데 1의 보수를 해주면 0110 0011 2의 보수를 해주면 +1이 되니
100이 된다. ebp-100
string은 ebp-100이 된다.
104 - 100 = 4
check의 초기값은 0이니 string을 string[0]에서 0x08을 4번해주면 count가 -4가 되어 string[-4]로 check주소에 도달할것 이다.
payload
(python -c 'print "\x08" * 4 + "\xef\xbf\xad\xde"';cat) | ./attackme
'시스템 해킹 > FTZ' 카테고리의 다른 글
FTZ - Level20 (0) | 2020.01.12 |
---|---|
FTZ - Level19 (0) | 2020.01.11 |
FTZ - Level17 (0) | 2020.01.10 |
FTZ - Level16 (0) | 2020.01.10 |
FTZ - Level15 (0) | 2020.01.10 |