목록전체 글 (166)
Pwnstar

여섯 번째 문제 이제 느끼는 거지만 bof문제가 참 많다.. 이것도 64비트 bof인 것 같다. 우선 아무런 보호기법이 걸려있지 않은 것을 확인했다. IDA로 열어보았다. 처음에 버퍼의 주소를 주고 gets로 입력을 받는다. 함수 목록을 확인해보니 shell을 실행시키는 함수도 없고, 그냥 쉘코드를 넣으면 될 것 같다. 그런데 입력을 받는 버퍼의 크기가 굉장히 크다. 6d30h = 27952 여기에 쉘코드를 넣고 ret에 버퍼의 주소를 주는 것도 좋을 것 같다. -> 버퍼의 주소를 주는 이유같다. 우선 버퍼의 주소를 출력해주면 그 값을 받아와서 저장하고, 이 값으로 돌아오면 되겠지?? 그리고 버퍼의 크기가 크니까 어디든 넣어놓으면 될 것 같다. 요렇게 버퍼의 주소를 가져올 수 있었고 총 버퍼크기 = 27..

다섯 번째 문제이다. 대놓고 64비트 버퍼 오버플로우인것 같다. Full RELRO가 걸려있어 got overwrite가 불가능하고, NX 때문에 shellcode를 넣지도 못한다. IDA 입력을 받고, "Hello XXX" 이런 식으로 출력해주는 단순한 프로그램이다. 전역변수 s가 rbp-110h(272)에 위치하고, 요렇게 shell을 실행시킬 수 있는 함수도 존재한다. callme_address = 0x400606 payload = dummy*(272 + 8) + callme_address 이렇게 짜면 될 것 같다. 요렇게 익스코드를 짜 주고 실행해보았다. 끗

네 번째 문제이다 음...문제 이름만 봐서는 버퍼 오버플로우 같긴한데... 우선 32비트인 것을 확인했고, 아무런 보호기법도 걸려있지 않았다. IDA로 켜 보았다. 음?? 단순한 버퍼오버플로우인가?? 쉘코드도 넣을 수 있고, 넣을 공간도 있으니 한번 활용해보도록 하겠다. 이름을 넣는 name 전역변수에 쉘코드를 넣고 ret에 name 주소를 주면 될 것 같다. name_address = 0x804a060 이름을 입력받은 부분에 32바이트보다 작은 쉘코드를 넣어주고 input을 입력받는 부분에 14h() + 4 + name주소 이렇게 payload를 주면 될 것 같다. 익스코드를 다음과 같이 구성했고 끗

세 번째 문제 basic_fsb이다. Format string bug를 이용해서 푸는 문제 같은데 일단 IDA로 열어보았다. 32bit 파일이고, main 함수는 별 거 없었다. 이렇게 vuln()함수만 덜렁 있고, 들어가보니 fgets함수로 1024만큼 입력을 받는게 코드의 전부였다. snprintf함수에서 format stirng bug 취약점이 발생할 것 같다. 우선 전형적인 fsb를 푸는 방식대로 입력을 줘 보았다. 이렇게 두 번째에 41414141(AAAA)이 나왔고, 이 부분을 이용할 수 있을 것 같다. 사실 이 문제를 풀기 전, fsb가 이해가 잘 되지 않아서 많은 블로그들을 돌아다니며 공부를 꽤나 오랫동안 했는데 그 덕분에 잘 이해를 하게 되었다. 다시 한번 풀어보면서 차근차근 풀이 과정을..

HackCTF의 두 번째 문제. IDA로 디컴파일한 코드이다. 첫 번째 문제와 마찬가지로 NX만 걸려있다. s의 크기가 8Ch로 140바이트인데 fgets로 133바이트만큼만 입력을 받고, 그 이후에 ebp-Ch에 존재하는 v5가 실행된다. fgets로 입력을 받기 때문에 버퍼 오버플로우가 불가능하다고 생각되어 어떻게 풀어야 하나 보던 중 함수 목록에 shell이라는 함수가 보였다. v5가 실행되는 부분에 shell의 주소를 덮어준다면 문제를 풀 수 있지 않을까 싶어서 코드를 짜보았다. 8C(140) - C(12) = 128바이트만큼 dummy를 넣고 그 이후에 shell의 주소를 넣어보았다. 끗

HackCTF의 첫 번째 문제이다. mitigation은 NX만 걸려있어 쉘코드를 실행시키지 못한다. IDA로 디컴파일한 코드 fgets로 s에 입력을 받고, v5의 주소를 보여준다. v5 != 67305985이고, 동시에 v5 != 3735928559 이면 You are on the right way!라는 문구를 출력해주는데 불가능한 조건문이므로 넘어가자. 아래 조건문을 보면 위 조건문의 조건 중 하나만 충족하면 쉘을 획득할 수 있는 모양이다. 그런데 숫자가 좀 이상하다 싶어 16진수로 바꾸어 보았는데 deadbeef였다. s는 ebp-34h, v5는 ebp-Ch에 위치하므로 34h(52) - Ch(12) = 40 s에 dummy 40바이트를 넣으면 그 다음 값으로 v5를 덮을 수 있을 것이다. 그래서..