picoCTF 2019 OverFlow 1 - Points: 150

2583 단어 picoCTFCTF

문제





풀어봤어



소스를 살펴보겠습니다.



flag()가 실행되면 flag의 내용이 표시될 것 같습니다.
그렇지만, flag()는 어디에서도 불려 있지 않습니다.

처리의 흐름으로서는
30行目のmain()が実行される。
36行目の処理で23行目のvuln()に移動する。
28行目でvuln()が終わって呼び出しもとの次の処理37行目に移動する。
終了。

라는 느낌입니다.
vuln()에서 main()으로 돌아가는 주소를 괴롭히고 flag()로 날리는 작전으로 좋을까.
즉 28행째의 vuln()이 끝났을 때에 「다음은 37행째예요」라고 하는 처리를 재기록해 「다음은 11행째예요」라고 하면 된다.

라고 이론은 알고도 실제 할 수 있는지는 모른다.
우선 쉘에서 실행해 보겠습니다.



실행해 보겠습니다.



실행하면 1회 입력 상태가 되고 무언가 입력하면 점프의 주소가 표시되어 종료한다.
이 표시되는 주소는 소스를 본 곳



vuln이 돌아 오는 곳의 주소처럼 보입니다.
그렇다면 긴 문자를 넣으면 스택이 다시 쓰여져 여기의 주소도 다시 쓸 것입니다.
긴 문자를 넣어보십시오.



아까의 실행으로 점프처는 「0x8048705」라고 하는 것을 알고 있습니다.
이 첫 번째를 보면 "0x8048705"로 맞습니다.
2번째가 점프처가 2개 나오는 의미는 잘 모릅니다.
3번째를 보면 「0x8040061」로 바뀌고 있습니다. 61은 a의 의미입니다.
a를 늘릴 때마다 61이 늘어나는 것을 알 수 있습니다.
그래서 이것으로 다시 쓸 수 있습니다.

다음은 flag()의 주소입니다.
gdb ./vuln

실행 후



그렇게하면 플래그의 주소를 알 수 있습니다.
「0x80485e6」입니다.
*라든지&는 잘 모르겠습니다.
모두 해 보았습니다만, 모두 함께의 결과였습니다.

리틀엔디안에 주의하면서 실행하면



그래서 Flag가 나왔습니다.

좋은 웹페이지 즐겨찾기