전체 글 (187) 썸네일형 리스트형 poet 제목이 시인인데 뭘 얻을만한 힌트가 없었습니다.. 아마 시를 쓰겠구나 정도 시를 써서 백만점을 받아야하고 그렇지 않으면 프로그램이 종료되지 않고 무한히 반복하게 됩니다 프로그램을 디컴파일해보면 if문이 참이되면 while문을 break하고 reward함수를 실행시키게됩니다. (이름부터가 flag를 줄 것 같은..) reward함수를 보면 flag를 출력시켜 줍니다 get_poem함수에서도 BOF가 발생하지만 get_author에서 발생하는 BOF를 통해 1000000과 비교하는 변수를 변조할 수 있게됩니다. 그렇기 때문에 bof를 get_author에서 발생하는 BOF 취약점을 사용하여 0x6024e0를 변조를 백만으로 변조하도록 스크립트를 작성하면 됩니다. yes_or_no문제 풀고 푸는거라 긴장 빡하.. BOF_PIE 어제 점심에 면접보고 vm를 키는 와중에 저도 모르게 리눅스를 시원하게 날려버렸습니다... 덕분에 올리려고했던 글로 강제로 비공개하게 되었고 공부도 제대로 못한것 같고 뭐하나 풀리는게 없던 하루였는데 워게임 문제가 한번에 익스가 되서 잠은 기분좋게 잘수 있을 것 같습니다 문제 제목을 보고 어느정도 짐작할 수 있었습니다 PIE가 걸리 BOF 문제이겠구나.. checksec을 통해 어떤 보호기법이 활서화되어 있는지 보면 PIE와 NX가 활성화 되어있습니다 RELRO는 지금 제 지능에선 생략하고 나중에 사실 PIE부터 설명하고 문제 풀이를 하던 해야하는데 금붕어 brain이라 금방 공부한걸 까먹어버려서 풀이만 하겠습니다 IDA로 main function을 확인해보면 welcome이라는 함수를 호출하고 이후에 .. 백준 1011번/ Fly me to the Alpha Centauri [C] 해당 카테고리에 봉인한 x64 asm로 작성한 hello world를 뒤로하고 첫 프로그래밍 글을 적어보려고 합니다 CTF 문제 풀 때만큼이나(?) 재미있는 문제라고 느끼면서 푼 것 같습니다. C언어 코드로 작성하였고 그나마 C를 사람처럼 함 메모리도 적게 쓴 것 같아 기분이 좋네요 헿 해당 문제는 저희가 우현의 우주선을 Alpha 뭐로 보낼 때의 최소 이동 횟수를 구하는 문제인데요 문제까지 글로 쓰긴 엄마가 강아지 산책시키라고 해서 문제를 모르신다면 한 번 읽어보시는 것도...ㅋㅋ 문제에 따라 1의 거리, 2의 거리.... 20의 거리(?) 뭐 몇 거리나 하나 생각해보면 (특징을 위해 5부터 예로) X Y 위프 최소 거리 0 5 1211 4 0 6 1221 4 0 7 12211 5 0 8 12221 5.. 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를 비교하게 됩니다. 다시 .. 리버싱 #04 abex crackme 2 분석 crackme2 실행 파일을 실행시키면 로그인 창(?) 같은 것이 출력됩니다. name에는 abcd를 Serial에는 1234를 입력한 후 check를 누르게 되면 시리얼 번호가 틀렸다는 오류 메시지 박스가 출력됩니다. 이문제에서의 목표는 crackme1과 같이 성공 메시지 박스가 출력되도록 하는 것과 올바른 시리얼 번호를 찾는 방법입니다. 디스 어셈 코드로 돌아와서 시작 주소는 00401238입니다. 스택에 00401 E14 주소를 입력하고 다음 수행 명령어인 CALL 명령어의 변숫값 출력 창을 보게 되면 어떤 함수를 call 하는지 알 수 있습니다. 변숫값 출력 창은 어셈블리 코드 창 바로 아래에 위치하고 있습니다. CALL명령어에서는 00401232 주소에서 JMP명령어로 ThunRTMain() 함.. 리버싱 #03 abex crackme 1 분석 crackme1을 실행시키면 이전 hello world! 보다 코드수가 적은 것을 알 수 있습니다. 왜냐하면 crackme는 어셈블리어로 만들어졌기 때문에 이전과 다르게 복잡하지 않습니다. 우선 프로그램을 실행시켜보면서 무엇을 하는지 확인하겠습니다. [F9]을 통해 프로그램을 수행하면 "Make me think your HD is a CD-ROM"이 적힌 MessageBox가 출력됩니다. 우선 [확인]을 누르고 계속 진행하면 에러 메시지 박스가 출력되며 프로그램이 끝나게 됩니다. crackme1은 HD를 CD-ROM으로 인식해야 합니다. 저도 쓰고도 무슨 말인지 잘 모르겠습니다. 하나 정확한 것은 crackme1 어셈블리 코드를 보았을 때 Error 메시지 박스 대신 YEAH! 성공(?)을 의미하는 메시.. 이전 1 ··· 20 21 22 23 24 다음