pwn/ gets

문제부터 Gets가 나오는 걸로 봐서 gets함수를 통해 버퍼오버플로우 문제인 것을 짐작할 수 있습니다.

zip 파일을 받아서 C 코드를 읽어보면

gets함수로 32비트 크기의 buf배열에 입력을 받고
if문 2개를 통해 buf와 debug를 검사하고 같다면 flag를 출력해줍니다.
gets함수는 입력을 저장할 변수의 크기를 고려하지 않기 때문에 여기서 gets에 주어진 크기인 32(0x20) 보다 많이 데이터를 넣게 되면 즉 버퍼오버플로우가 생기겠죠

그럼 궁극적인 목표는 flag를 출력하는 것이고 그렇기 위해서는 위에서 말했듯이 두개의 if문의 비교가 true가 되어야 합니다.
if문이 비교하는 값들을 보면 buf와 "Yes" 문자열을 비교하고 debug와 0xdeadbeef를 비교하게 됩니다.

다시 코드를 보면 buf는 gets함수를 통해 Yes를 넣을 수 있지만 debug함수는 0으로 초기화되어 있죠
그렇기 때문에 버퍼오버플로우로 debug변수의 값을 0xdeadbeef로 변조하고 buf에는 "Yes"라는 문자열이 들어가도록 하면 될 겁니다.
그리고 그렇게 하기 위해서는 메모리상에 debug변수와 buf와의 거리를 알아야만 그위치를 알고 debug에 원하는 값을 넣어 줄 수 있겠죠

gets함수를 보면 rax레지스터에 [rbp-0x30]의 주소 값을 넣고 gets함수를 실행시키는 걸로 봐서 rbp-0x30이 duf의 위치인 것을 알 수 있습니다.
또한 바로 위에 rbp-0x8에 0의 값을 넣는 것으로도 debug 변수가 해당 위치에 있는 것을 알수 있습니다.

물론 이후에 나오는 strcmp함수로의 비교와 cmp명령어를 통해서로 각각의 위치를 파악할 수 있습니다.
그럼 duf는 rbp-0x30이고 dedug는 rbp-0x8이기에 서로 40(0x28) 바이트만큼 떨어져 있게 되겠죠

이것을 토대로 입력을 받는 duf는 Yes의 문자열이 여야 하기에 Yes와 이후에 \x00으로 채워주고 "Yes" + \x00의 개수가 40이 될 때 0xdeadbeef값을 넣어주도록 코드를 짜서 실행시키면

flag를 얻을 수 있었습니다
포너블은 처음이라 재미있게 푼 것 같습니다