먼저 파일을 실행해 보았다 보호기법을 확인해보았다. NX Bit 가 걸려있다. IDA로 파일을 까봤다. read를 통해 buf를 입력을 받고 출력을 한다. 오버플로우를 확인해보자 breakpoint를 main함수의 첫번째와 read함수 전으로 지정해주었다. dummy값을 72로 설정하면 될것 같다. libc leak을 해야한다. libc leak을 하기 위해 read의 plt와 got영역의 주소가 필요하다. 또한, IDA를 볼때 옆에 메뉴(?)에서 puts함수가 있었다. 따라서 puts함수의 plt를 이용한다. 그리고 gadget을 구해야한다. 코드는 dummy값을 72개 채운다음 gadget + read_got + puts_plt순으로 전달을 한다. 그러면 read함수의 주소를 구할 수 있다. 그런다음..
먼저 파일을 실행해본다 system함수의 주소가 계속 바뀐다 보호기법 확인 NX bit가 걸려 있음 RTL을 통해서 우회할 수 있으므로 RTL로 문제 풀이 RTL을 이용하려면 system함수의 주소와 "/bin/sh"문자열의 주소가 필요 IDA로 파일을 까봤다. s의 크기는 68byte gets함수에서 버퍼오버플로우 발생 일단 디버깅 한 후 main함수 disas했다 main+40을 보면 0x44로 68바이트 이는 s의 크기와 같다 따라서 dummy가 없다 메모리 구조는 다음과 같다 ret[4] sfp[4] s[68] 72바이트를 dummy값으로 채워주고 ret에 system함수와 "/bin/sh" 문자열의 주소를 넣어주면 된다 main함수의 첫번째 명령어, gets함수 호출, ret에 breakpoin..
먼저 파일을 실행 이름을 물어보고 모르면 이상한 소리를 낸다 IDA로 코드를 까봄 s에 문자열을 입력을 받는다 s의 크기는 59byte what is your name? what is your quest? what is my secret? 다음에 s에 입력을 받다 print flag에 도달하기 위해서 what is your name? what is your quest? 다음 문자열을 입력받을 때는 "Sir Lancelot of Camelot\n"와 "To seek the Holy Grail.\n"를 입력 받아야 한다. What is my secret? 다음에는 gets함수로 문자열을 입력 받는다. v5의 값이 -559869752여야 print_flag를 할 수 있기 때문에 오버플로우를 이용하여 v5의 값..
먼저 파일을 실행해보았다 메뉴를 입력하면 해당하는 메뉴에 맞게 출력이 된다. NXbit 가 걸려있는데 RTL로 풀면 될 것 같다. 코드를 확인해보자 main함수 안에서 reduced_shell()을 호출한다 gets로 문자열을 입력 받는데 여기서 오버플로우가 일어난다 s의 크기는 0x1c=28byte이다. 더미값이 있는지 확인하기 위해서 디버깅 했다. 디버깅을 했더니 너무 길어서 reduced_shell 첫번째 명렁어에 bp해주고 gets함수 call 명령어에 bp 해준다음 거리를 구했다. 32바이트로 이는 28바이트 + 4바이트(sfp)인것을 알 수 있다. 따라서 더미값이 없음을 알 수 있다. 구조가 다음과 같을 것이다 ret[4] sfp[4] buf[28] 32바이트 만큼 dummy값을 채운다음 re..
먼저 파일을 실행해보았다 do you know return to library라고 되어있는걸 봐서 rtl 문제인거 같다 NX bit 가 걸려있다. RTL로 풀면 NX bit는 우회할 수 있으므로 RTL로 풀자 코드를 IDA를 이용해서 까보자 알고 싶은 주소값을 던져주면 See_something()을 통해서 해당 주소에 어떤 값이 저장되어 있는지를 출력을 해준다. 남길 말을 입력하라고 하는데 이때 Print_message에서 buffer overflow가 발생할 수 있다. Print_message함수의 인자로 256바이트가 전달 될 수 있는데 함수 내에서는 56바이트 버퍼에 카피를 하고 있다. 이때 오버플로우가 발생한다. Print_message함수를 디버깅을 해보자 +13을 보면 ebp-0x38로 크기가..
파일을 실행시켰더니 다음과 같이 나왔다 문자열을 입력받고 나서 버퍼의 주소가 출력되는 것 같다. 파일을 실행시킬때 마다 버퍼의 주소가 다르게 나오는 것을 확인할 수 있었다. 보호기법을 확인해보았는데 딱히 걸려있는게 없다. IDA로 파일을 까보았다. scanf로 입력을 받을때 overflow가 일어나는 것을 알 수 있다. 그리고 버퍼의 주소가 출력되는 것을 확인할 수 있었다. ret에 버퍼의 주소를 넣어주는 방식으로 접근을 해보았다. s의크기는 0x88=136이고 sfp의 크기는 4이다. ret전까지의 크기는 140바이트가 되는데 여기에서 25바이트 쉘코드를 사용하게 되면 115바이트를 dummy로 채워주면 될것이다. 또한, 버퍼의 주소가 계속 바뀌기 때문에 recv를 이용하여 받아온다. !!오타가 나면 ..
먼저 파일을 실행해 보았다. 문자를 입력받으면 그 문자를 출력하는 형태인것 같다. 보호기법이 뭐가 있는지 확인해 보았다. NX가 걸려있다. 쉘코드를 사용하지 못한다. IDA를 이용해서 뜯어보자 s를 입력받고 v5에는 s의 길이가 들어가고 printf를 통해 s를 출력한다. s를 입력받을때 그 길이가 제한되어 있지 않으므로 여기서 오버플로우가 발생할 수 있다. s의 크기는 0x110=272바이트이다. 예전에 이런 문제를 풀었는데 이때 함수를 이용하여 문제를 풀었다. 따라서 함수가 뭐가 있는지 확인한다. callMeMaybe라는 함수가 있다. 이 함수의 주소는 0x400606이다. 자세히 살펴보자 이 함수는 쉘을 실행시키는 함수이다. 따라서 이 함수의 주소를 ret에 넣어준다면 풀릴 것이다. s의 크기는 2..
먼저 파일을 실행해보자 값이 계속 바뀐다 보호기법을 확인하자 FULL RELRO와 PIE가 걸려있다. IDA로 파일을 까보자 main에서는 echo호출을 한다. echo함수에서는 s의 주소를 출력하고 gets함수를 통해 입력 받는다. 변수 s의 크기는 0x12a=298바이트이다. 위에서 보호기법을 확인할 때 NX가 걸려있지 않으므로 쉘코드를 이용하여 푼다. s에 쉘코드를 넣고 ret주소에 s의 주소를 덮어쓰면 echo 실행 이후 ret가 호출될 때 쉘코드가 실행될 것이다. echo를 disas 해주자. echo+24부분을 보면 크기가 0x12a인것을 알 수 있고 여기서 dummy가 없다는것을 알 수 있다. 메모리의 구조는 다음과 같게 될 것이다. ret[4] sfp[4] s[298] payload는 s에..
먼저 파일을 실행해보자 실행시켰더니 이상한 값이 나온다. 보호기법이 뭐가 있는지 확인해보자 NX가 걸려있다. 쉘코드를 사용하지 못한다. IDA로 파일을 까보자 v5에 sup함수의 주소를 넣고 s변수에 133바이트 만큼 입력을 받는다. 그리고 v5를 실행한다. sup함수는 s변수를 그대로 출력한다. s의 크기는 0x8c, 즉 140바이트인데 133바이트까지만 입력받을수 있으므로 RET는 변조를 하지 못한다. 그러나, sup() 함수의 주소를 담고 있는 void 포인터의 메모리는 덮어 쓸 수 있다. 이는 v5이므로 v5의 값을 변조시키면 문제는 풀릴것이다. 먼저 함수가 뭐가 있는지 살펴보자 shell이란 함수가 있는 것을 확인할 수 있다. v5에 shell함수의 주소를 넣으면 문제가 풀릴것 같다. she..
파일을 실행해보자 뭔가가 계속 변한다. IDA로 수도코드를 확인하자 main함수에서 echo함수를 호출하고 echo함수에서 gets를 통해 s를 입력받고 s의 주소값을 출력한다. 위의 실행결과와 코드를 합쳐서 보았을때 s의 주소값이 계속 변하는 것을 알 수 있다. s의 크기는 238바이트이다. echo를 disas해서 살펴보면 버퍼의 크기가 0xee인 것을 확인할 수 있다. 이것은 s의 크기이고 따라서 dummy 값이 없음을 알 수 있다. (다른 방법) bp1 : echo 함수의 첫번째 명령어 - 최상위 스택의 주소를 구할 수 있고 여기에 return address가 들어있음 bp2 : gets함수를 호출하는 call명령어 - s 주소를 구할 수 있음 bp1에서 구한 주소값은 0xffffd03c이고 bp..