ii4gsp
FTZ - Level14 본문
힌트를 보면 gets()함수가 아닌 fgets()함수를 써서 45byte만큼의 입력만 받아 ret변조를 불가능하게 만들어뒀다.
check의 값을 0xdeadbeef로 변조를해서 쉘을 실행시켜야한다.
attackme를 tmp에 복사하고 gdb로 분석을 해보자
<main+3>에서 0x38만큼 할당해주었다.
0x38은 10진수로 56byte이다.
crap[4byte] + check[4byte] + buf[20byte] = 28byte
컴파일러가 생성한 dummy는 28byte이다.
<main+27>에서 0xffffffc8은 2진수로 1100 1000인데 1의 보수를 해주면 0011 0111에서 2의 보수를 구하면 +1이 되니 56이된다.
ebp-56 위치 주소를 eax로 옮기는 걸 알 수 있다.
<main+30>에서 eax를 스택에 올리고 fgets()함수를 호출한다.
buf배열의 크기는 ebp-56부터 20만큼이니 ebp-36까지다.
<main+39>부분에서는 0xfffffff0 즉 1111 + 1인 16
ebp-16과 0xdeadbeef이 문자열 비교를 한다.
buf와 check 변수 사이에 20만큼의 더미가 있는 걸 알 수 있다.
입력한 값이 저장된 부분과 문자열을 비교하는 부분까지 40byte의 빈 공간이 있는데 이 공간에 쓰레기 값을 입력하고 check 변수에 들어갈 deadbeef 값을 리틀 엔디언 방식으로 넣어주면 될것이다.
buf와 check사이의 빈공간 40byte의 값을 채워주고 check변수에 0xdeadbeef를 리틀엔디언 방식으로 \xef\xbe\xad\xde로 넣어주면 된다.
payload
(python -c 'print "\x90" * 40 + "\xef\xbe\xad\xde"';cat) | .attackme
'시스템 해킹 > FTZ' 카테고리의 다른 글
FTZ - Level16 (0) | 2020.01.10 |
---|---|
FTZ - Level15 (0) | 2020.01.10 |
FTZ - Level13 (0) | 2020.01.08 |
FTZ - Level12 (0) | 2020.01.08 |
FTZ - Level11 (0) | 2020.01.07 |