level 14 로그인 후 hint를 본다.
위 hint를 분석하면 아래와 같다.
C 코드를 분석하고 gdb를 열어본다.
gdb를 보면 0x38(56)byte만큼 공간을 확보하고 ebp-16에 0xdeadbeef를 저장한다.
이렇게 보면 level 13과 똑같이 분석할 수 있다.
확보한 공간보다 -16에 0xdeadbeef를 저장한다고 생각하면 쉽다.
fegts으로 입력을 받고 있으니 level 12와 같이 pipe를 이용해 명령을 넣어 줘야 한다.
level 13문제와 비슷해서 쉽게 느껴질 수도 있다.
그래서 0xdeadbeef는 40byte 이후에 저장한다.
여기서는 코드에서 쉘을 실행시켜줘서 주소를 구할 필요는 없다.
공격 코드만 크기에 맞게 만들어 주면 되는데 도식화하면 이렇게 된다.
56byte 확보 | buf | check | crap | dummy | |
40byte | 4byte | 4byte | 8byte | ||
선언한 20보다 넘게 저장해 BOF를 일으킴 | 0xdeadbeef 저장 | int선언 int는 4byte | 쓰레깃값 | ||
SFP (4byte) | |||||
RET (4byte) |
gdb를 보면서 스택 구조로 보게 되면 이렇게 된다.
main+17에서 ebp-56가 있고 다음에 fgets을 호출한다.
즉 입력 값은 ebp-56에 저장된다. buf의 크기는 20byte이므로 ebp-36까지다.
그다음 main+29에서 문자열을 비교한다. check 변수는 ebp-16에 저장되어 있고 지금까지 나온 건 ebp-36이다. 이로써 buf와 chack 사이에 dummy 값 20byte가 들어 있는 걸 확인할 수 있다.
스택 구조
char buf[20] 20byte |
dummy 20byte |
check 4byte (int) |
crap 4byte (int) |
dummy 8byte |
SFP 4byte |
RET 4byte |
정확한 스택 구조는 이렇게 된다. 위 도식화한 표는 dummy 값까지 포함해 간단하게 한 것이다.
정확한 스택 구조와 크기를 알았으니 공격을 하면 된다.
공격 코드를 보자면 "A"를 40byte 주고 check를 저장해서 "|" 파이프를 이용해 입력을 attackme에 넘겨준다.
'System Hacking > 해커스쿨 F.T.Z Hacking Zone' 카테고리의 다른 글
해커스쿨 F.T.Z Level 16 (0) | 2020.02.27 |
---|---|
해커스쿨 F.T.Z Level 15 (0) | 2020.02.26 |
해커스쿨 F.T.Z Level 13 (0) | 2020.02.24 |
해커스쿨 F.T.Z Level 12 (0) | 2020.02.23 |
해커스쿨 F.T.Z Level 11 BOF(Buffer OverFlow) (0) | 2020.02.23 |
댓글