처음으로 다른 함수를 호출하는 구성 방식이당
strncpy로 막아둔 것 같은데 buffer가 40인데 41은 모지..??
test 해봤다.
test.c
이제 인자를 A 40개 줬을 때와,
A 40개 + B 1개 줬을 때를 비교할 것이다.
>> 결과
41개를 입력하면 뒤에 쓰레기값이 온다.. 뭘까...
암튼 41개까지 입력할 수 있으므로 problem_child의 sfp의 마지막 값을 조정할 수 있겠군
이런 공격 기법을 SFP overflow라고 한다 [ 참고 : https://d4m0n.tistory.com/76 ]
어셈 까보면
-------------------
buffer 주소 ☞ problem_child
-------------------
buffer[40] ☞ problem_child
-------------------
sfp ☞ problem_child
-------------------
ret ☞ problem_child
-------------------
argv ☞ problem_child
-------------------
sfp ☞ main
-------------------
ret ☞ main
-------------------
임을 알 수 있다.
core dump 파일 생성
gdb -c core
대충 여기저기 보면서 인자값으로 넣은 "A"*41이 스택의 어디에 쌓였는지 보고싶다.
발견!
0x41의 시작주소는 정확히 0xbffffac4
[0xbffffac4 - 4]는 0xbffffac4(buffer 시작주소)를 담고있다.
이게 뭘 의미하느냐....
problem_child의 에필로그(leave, ret)에서
leave = mov esp, ebp & pop ebp
ret = pop eip & jmp eip
이므로 sfp를 buffer시작주소-8로 변조한다면 pop eip, jmp eip를 통해 jmp buffer 시작주소로 갈 수 있음을 알 수 있다.
즉, buffer에 쉘코드를 넣고, 마지막 1byte를 buffer시작주소 - 8의 마지막 바이트(0xbffffabc)로 변조한다면?
'워게임 > LOB' 카테고리의 다른 글
LOB - bugbear(RTL, execve함수) (0) | 2021.08.07 |
---|---|
LOB - darkknight(RTL) (0) | 2021.08.05 |
LOB - skeleton (0) | 2021.08.03 |
LOB - vampire(심볼릭링크) (0) | 2021.08.01 |
LOB - troll (환경변수) (0) | 2021.08.01 |
댓글