CTF (12) 썸네일형 리스트형 test INCOGNITO CTF 2021에 출제되었던 pwnable 첫 번째 문제입니다 이문제는 기본적인 ROP문제입니다 (제일 쉬운 문제...) 이전에 wargame에서 접했던 문제에서는 libc가 제공되었지만 해당 문제에서는 바이너리 파일만이 주어져서 재미있다고 느꼈습니다 NX bit와 Partial RELRO만이 걸려있습니다 IDA를 통해 확인해보면 test함수의 반환 값을 professor함수의 매개변수로 전달됩니다. test함수에서는 수식의 답안을 정수로 입력받고 조건문을 수행하여 반환 값이 20x가 됩니다 조건문에서는 a1의 값에 따라 xor 또는 곱셈을 수행하여 반환하게 됩니다 매개변수는 연산의 답안이 들어가기 때문에 올바른 정수 값을 입력하면 안 되고 encrypt함수를 수행한 값과 동일해야 합니.. PWN / fake_canary 이번 문제는 ImaginaryCTF 2021에서 나온 문제입니다. 간단한 문제지만 플래그를 얻지는 못했고 그 대신 모르는 지식을 얻어간 문제입니다 아직 뉴비인 저에겐 더욱 좋죠 무엇보다 이 글은 문제 풀이보단 문제를 풀지 못한 이유와 그것을 이해하는데 중점을 두려고 합니다ㅎㅎ 해당 문제에서는 64비트 ELF 파일이 주어집니다. 어째 이름부터가 fake_canary이기에 stack-canary가 걸려있을까 보았는데 canary는 걸려있지 않습니다 주목적이 풀이가 아니기 때문에 빠르게 보고 넘어가면 gets를 통해 bof가 발생하고 fake-canary는 static(0 xdeadbeef)으로 rbp-0x8과 비교하여 overflow 여부를 판단하기 때문에 ret값까지 데이터를 넣다가 rbp-0x8에서 fa.. pwn/ madlibs 제작가가 미친 도서관 게임(...)을 만들었다고 합니다. 초급자인 저에게는 가혹할 것 같은 문구네요 차례대로 코드를 보면 game함수에서 두개의 문자열을 입력받고 이것들을 합치고 어러꿍저러꿍한 값을 sprintf를 통해 80크기의 배열인 buf에 저장하고 buf를 출력하게 됩니다. 해당 코드에서는 sprintf로 문자열을 buf에 저장을 하였는데 sprintf함수에서도 버퍼오버플로우가 발생할 수 있다는 것입니다. 그럼 buf에 저장하는 값이 0x80을 넘겨서 return address를 win함수로 덮어쓰게되도록하면 flag가 출력되겠죠 buf에 넘어가는 문자열을 %s를 변수명으로 치환해서 다시 나타내면 "noun is so adj at deepspacewifu! I wish I were adj like.. 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를 비교하게 됩니다. 다시 .. 이전 1 2 다음