본문 바로가기
워게임/LOB

LOB - golem(SFP overflow)

by meanjung 2021. 8. 4.

처음으로 다른 함수를 호출하는 구성 방식이당

 

 

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

이므로 sfpbuffer시작주소-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

댓글