LOB Level 9.pw = 'aspirin' 일단 변경 사항.if(argv[1][46]==“\xff”)이면 종료 시킨다.일단 다른 건 크게 변동사항이 있지는 않다.ret에 담는 주소는 bffff~ 와 같은 형태이다. argv[1][46]이 \xff이면, 프로그램을 종료시킨다. tmp 폴더에 복사 후 core dump를 통해 주소 값을 알아내야 한다. [troll@localhost /tmp]$ ./vampire 'python -c 'print "A"*44+"\xa0\x75\xfe\xbf\+"\x90"*100000+"\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x..
# Related site issues/LOB
LOB Level 8. pw ='timewalker' 음................문제가 이전 몇 개부터 거의 틀이 비슷한 거 같다.일단 argv가 2가 아니면 프로그램이 종료 => 즉 argument 무조건 1개만 사용해야 된다. 하나하나씩 보자.일단 argument는 무조건 1개 사용. 환경변수도 사용 X. 1개의 argument의 48번째 byte는 \xbf이여야 한다.argument의 길이가 48보다 크면 프로그램이 종료된다. 40바이트의 buffer 캐릭터 배열은 40byte만큼 0으로 덮어씌워진다. 결국 strcpy에서 40바이트에는 셀 코드를 넣지 못하고, SFP(4바이트)와 RET(4바이트)는 0으로 덮어씌워지지 않고, 리턴주소는 변경이 가능하다. 또한 사용 가능한 1개의 argument..
LOB Level 7.pw = 'Kernel crashed' 일단 그 전 문제랑 거의 비슷. 달라지는 건 argv[0]의 길이가 77이 아닐 때 종료한다는 것이다. [darkelf@localhost /tmp]$ gdb 'python -c 'print "."+"/"*67+"orge"'' iif(strlen(argv[0]!=77){} End of assembler dump. (gdb) b * main +302 Breakpoint 1 ast 0x804862e (gdb) r 'python -c 'print "A"*44+"\xbf"*4'' 'python -c 'print "\x90"*148'' Starting program: /tmp/ .//////////////////////////////////////////..
LOB Level 6. pw='love eyuna' 일단 한 줄씩 보자면, char형 buffer[40] 선언했고, argc가 2미만일 경우는 오류 메시지를 출력한다. egg hunter 환경 변수는 사용 금지한다. argv[1][47]와 “\xbf“와 같지 않다면, 오류 메시지를 출력 후 종료한다. 단 strlen(arg[1])는 길이를 체크하는 C함수이다. 즉 argv[1]의 길이가 48이 넘을 경우에는 오류를 출력하고 종료. strcpy는 argv[1]에 있는 것들을 buffer에 복사한다. printf는 buffer를 출력한다. memset으로 buffer를 40까지 0으로 초기화한다. 일단 argv[2]에 쉘 코드를 넣는다. gdb로 argv[2]가 메모리에 올라오는 주소를 찾는다. buffer..
LOB level 5.pw = 'cantata' 저번 문제랑 마지막 줄의 buffer hunter만 다르다. 44byte만큼 할당. 0,40,buffer 순서로 인자를 전달하고 memset 함수를 호출.이게 buffer hunter 부분.즉 스택 구조를 보면 buffer[40] I SFP RET 쓰레기 값 argv[2] 이렇게 있다.일단 전 문제랑 똑같이 풀면 된다. argv[2]을 시작 주소를 찾아본다. 디스어셈했을 때, strcpy 함수에 argv[1]를 썼으니 찾는다. 일단 main+194에 브레이크 포인트 걸고, 실행. 브레이크 포인트가 나온 뒤 41이 나왔다. 시작 주소는 0xbffffc44. 이제 마지막으로 작성. [orc@localhost orc]$./wolfman 'python -c 'pr..
LOB Level 4.pw = "hackers proof" 일단 버퍼의 크기가 40이다. 쉘 코드가 들어갈 수 있는 공간이다. memset 통하여 환경 변수가 모두 초기화 됨을 확인.환경 변수에 쉘 코드를 등록하여서 사용X, RTL도 사용 불가.첫 번째 if 문은 많이 봐왔던 종료 구문. main함수의 argument가 없으면 종료되는 조건문. 주석으로 egghunter라고 달려있는 for문을 살펴보면, environ[i]를 0으로 menset 해주고 있다. environ은 환경 변수를 의미. 사용했던 환경 변수의 주소값을 알아내어 ret를 환경 변수의 주소로 덮어 씌우던 방법을 차단. 즉. 0xff - - - - - - -0x00 ~~ |env|argv|argc|ret|sfp|buf|2번째 if문은 인..
LOB Level 3.pw = 'hacking exposed' gets 함수가 있는데, gets 함수는 BOF를 발생시키는 함수다. 일단 main+3 sub %esp,16은 esp에서 16을 빼줬다.[buf만큼 16할당] main+6 lea %eax,[%ebp-16] eax에 ebp-16의 주소를 넣음. main+10 call 0x804830c gets 함수를 호출. main+22 push 0x8048470 stdin과 같은 함수. 즉, buf sfp ret 쉘 코드 ebp-16 ebp ebp+4 ebp+8 gets함수에다가 파이프를 사용. 파이프는 왼쪽 명령어를 오른쪽으로 보내주는 역할. function foo() [cobolt@localhost cobolt]$ (python -c 'print "\x9..
LOB Level 2. pw = 'hello bof world' 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); } 일단 1번 문제와 거의 비슷한데 argv의 개수 제한이 없고, 버퍼의 크기가 작다. 더미가 없다. argv[1]에는 ret를 argv[2]로 덮어줄 값을 입력하고, argv[2]에는 쉘 코드를 넣어주면 된다. (gdb) b *main+59 Breakpoint 1 at 0x804846b (gdb) r 'python -c 'print "\x90" * 24 '' 'python -..