문제 분석

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/869a9a35-916c-472a-a20f-8a5d1e7c6cc8/스크린샷_2021-08-15_오후_5.31.53.png

해당 문제에 netcat을 시도할 경우, buf가 먼저 출력되며, 그 다음 사용자의 입력을 받는다.

소스코드 분석

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/fe5121f5-29ee-48ae-a462-1e1a61a59770/스크린샷_2021-08-15_오후_5.33.02.png

buf를 128만큼 할당하고 scanf에서 141정도의 길이를 입력받는다. 여기서 buf의 길이보다 많이 할당받으므로, BOF가 발생할 수 있다.

문제 풀이

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/e4d3a833-0f54-46e6-bd61-05de1959be10/IMG_3502.jpg

main 함수 내에서 스택에 위에서 차례로 선언된 순서로 정렬하자면, (argc,argv) → main SFP → main RET → buf 이 순으로 스택이 쌓여있다.

그림대로 SFP, RET은 각각 4바이트를 차지하는데, 입력이 이미 141byte나 되니 buf에서 RET까지 입력값을 채울 수 있다. 그러므로 저 총 132 바이트를 채워버릴 쉘코드를 작성해보면 된다.

여기서 우리는 python의 pwntool 모듈을 사용할 것이다.

pwntool설치

pip install pwntools

우리는 쉘코드중 쉘을 열어주는 쉘코드를 사용할 것이다.

근데 여기서 주의할 점이 있다.