[dreamhack] baby-bof writeup

1. 문제

thumbnail
baby-bof

Simple pwnable 101 challenge
Q. What is Return Address?
Q. Explain that why BOF is dangerous.

https://dreamhack.io/wargame/challenges/974

2. 풀이

win함수를 실행시키면 flag를 열어서 출력해줄 것이다. 다만, main에서는 win함수를 실행하지않는데, 대신에 win함수의 주소를 준다.

name을 먼저 입력 받고, 그뒤에 hex value를 입력 받아서 integer count를 입력한 만큼 스택에 해당 hex value를 채우게되는데, 스택에는 항상 리턴주소가 존재하기 때문에 해당 값을 win함수의 주소로 덮어주면 flag를 얻을 수 있을 것이다.

gdbmain에 breakpoint를 걸고 실행시킨 후 backtrace를 보면 0x7ffff7c2a1ca__libc_start_call_main+122, 즉 main함수가 종료되면 리턴되는 주소가 담겨있다.

따라서 이 주소가 있는 부분을 win함수의 주소로 덮으면 main함수 이후에 실행될 것이다.

출력을 보면 상위주소는 다르지만 0xa1ca가 있는 주소가 4번째 위치에 존재하고, 이 위치까지 덮으면 win함수가 실행된다.

여기서는 로컬에서 했기 때문에 DH{sample_flag}가 실행되고, 실제 VM을 dreamhack에서 실행하면 실제 flag가 보인다.

사실 나는 대충 이것저것 입력해보다가 입력한 hex value로 주소가 덮이는걸 보고 때려맞췄다. 이렇게 기록하면서 제대로 공부하는 느낌…