goblin.c int main() { char buffer[16]; gets(buffer); printf("%s\n", buffer); } 이것도 goblin과 마찬가지로 buffer 16byte와 SFP 4byte는 nop로 채운뒤 ret에 system함수의 주소를 넣고 4byte의 nop와 /bin/sh의 주소를 넣었다. 이번엔 strcpy()가 아니고 gets()를 입력하였기 때문에, 파이프를 이용하여 공격하였다. goblin - hackers proof * 파이프? 파이프(|)는 두 가지의 명령어를 이어주는 역할을 한다. 왼쪽 명령어의 출력을 오른쪽 명령어의 입력으로 보내는 것이다.
cobolt.c int main(int argc, char *argv[]) { char buffer[16]; if(argc < 2){ printf("argv error\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); } gremlin과는 다르게 buffer의 크기가 16byte밖에 주어지지 않았다. 그래서 ret에 system함수를 이용하여 쉘을 띄우기로 했다. 우선, system()함수의 주소를 gdb를 이용하여 찾았다. system.c void main(){ system(); } system함수를 호출하는 부분에 브레이크 포인트를 걸고 print를 이용하여 system 함수의 주소를 찾을 수 있었다. 그 다음, system함수로 실행..
6번 문제를 들어가보니 지퍼 사진이있었다. 소스를 보니, 주석으로 zip이 적혀있는 것을 볼 수 있었다. 그래서 channel.zip을 다운받아보았다. 수많은 txt파일과 설명이 적혀있는 것을 보았다. 맨 마지막에 readme를 읽어보았더니 welcome to my zipped list. hint1: start from 90052 hint2: answer is inside the zip 가 적혀있었다. 90052.txt파일을 들어가보았더니 Next nothing is 94191 가 적혀있는 것을 볼 수 있었다. 아무래도 텍스트파일안에 있는 숫자가 다음 파일의 이름인 것 같았다. 90052부터 시작해서 압축파일의 설명을 출력해보기로 하였다. 아무래도 설명이 zip파일 내에서 달린것 같은데 이것을 어떻게 출..
4번문제에 들어갔더니 사진에 링크가 걸려있었다. 링크를 타고 들어갔더니 이 문장만이 있었다. 주소에서 44827을 입력하고 들어갔더니, 숫자만 바껴있었다. 아마도 주소의 숫자를 바꿔서 계속 가다보면 다음 문제로 연결된 답이 나오는것 같았다. urllib을 이용하여 다음 주소로 넘어가 그 주소에 있는 데이터를 받아와 숫자만 잘라와 다시 주소에 이어붙이는 방법을 이용했다. 중간중간 걸리는 다른 문장때문에, 처음 시작주소를 바꿔 다시 시작하는 경우가 2번정도있었다.
저는 buffer 256byte 공간과 SFP 4byte 총 260 byte공간을 NOP와 쉘 코드로 채운 뒤 return address에 buffer의 시작 주소를 넣어주었습니다. 우선, return address에 넣어주기 위한 buffer의 시작 주소를 찾아야겠죠? 저는 소스를 복사해서 printf("%x\n", buffer);를 추가해준 뒤 새로 컴파일을 했습니다. A를 260개를 넣어준 이유는 입력한 개수에 따라 주소가 달라지는데 제가 bof공격을 할 때에 쉘코드와 nop로 260byte를 채우기 때문에 똑같은 환경을 만들어 주기 위해 260개를 넣어준 것입니다. 이제 bof 공격을 해볼까요? \x90은 nop입니다. nop로 100byte, 25byte의 쉘코드, nop 135byte 총 26..
- Total
- Today
- Yesterday