Wargame Site/BOF
-
|Lord Of Bufferoverflow| #11 skeleton - golemWargame Site/BOF 2019. 6. 16. 11:49
자, 이 문제에서는 vampire > skeleton 에서 사용했던 방법은 통하지 않는다. memset 의 범위에 들어가기 때문이다. 결국, RET 만으로 overflow 를 이용해야한다. RET 하나만으로 어떻게 문제를 해결할 수 있을까? 우선 라이브러리에 접근하는 방법에 대한 이해가 필요했다. 오늘도 어김없이 구글링을 하다가 좋은 정리글을 발견했다. 출처 : https://jiafei427.wordpress.com/2016/11/15/ - 정적 라이브러리는 .a 로 끝나는 파일이며, 빌드 시에 실행 파일에 포함된다. - 공유 라이브러리는 .so 로 끝나는 파일이며, 여러 프로그램에서 공유된다. 디스크 공간이 절약되며 메모리 사용량 또한 절약된다. - 공유 라이브러리는 파일이 실행되는 시점에서 프로그램..
-
|Lord Of Bufferoverflow| #10 vampire - skeletonWargame Site/BOF 2019. 6. 10. 10:34
진짜 이 문제.... 나를 정말 힘들게 했다. gdb 를 돌려보다가 스택 마지막에 경로가 들어가는 것을 알 수 있었고, 이를 토대로 shell code 파일을 심볼릭 링크 파일 이름에 주입하는 형태의 풀이를 여러차례 시도했으나, 항상 이상한 에러가 발생했다. 지금부터 2 주일 동안 저질렀던 삽질을 공개한다. ㅜㅜ bash2 를 키고, 분석을 위해 skeleton 을 복사하여 skeletoa 라는 파일을 생성했다. 그 뒤, ln -s 를 통해서 /2F 가 없는 Shellcode 를 가지는 링크 파일을 만들어 주었다. 그래서 버퍼와 SFP 를 가득 채운 뒤, RET 를 \xbf * 4 로 해주었다. 왜냐하면 경로가 이미 스택에 들어가 있어 사실상 RET 만 바꿔주면 되기 때문이다. 자, bfbfbfbf 에서..
-
/bin/sh 을 실행하는 Shellcode 를 만들어보자Wargame Site/BOF 2019. 6. 7. 22:57
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80 매번 /bin/sh 를 작동시키는 Shellcode 를 사용했지만, 긁어오기만 했지 직접 이 코드를 분석한 적이 없었다. 성격상... 파헤쳐봐야겠다. 끄적끄적의 내용을 토대로 진행해보았다. 1. execve( ) /bin/sh 을 코드내에서 실행하기 위해서 어떻게 해야할까? 이 때 사용되는 것이 execve ( ) 이다. 출처 : http://shell-storm.org/shellcode/files/syscalls.html 또한, /usr/include/asm/unistd_32.h 에서도 확인할 수 있다. 이제 'man exe..
-
|Lord Of Bufferoverflow| #9 troll - vampireWargame Site/BOF 2019. 5. 20. 16:20
RET 조작을 힘들게 하기 위한 방법인 듯 하다. 사실 이전 문제들에서 \x90 ( NOP ) 이라는 값을 넣게되면 쉽게 해결을 할 수 있었다. 하지만, 정확한 이해를 위해 이 방법을 최대한 지양했었는데, 이번에는 이 기능을 쓸수 밖에 없을 거 같다. ( 정확히하려면 또 안써도 되지만 ) /x90 은 NOP 이라는 아무런 동작이 없는 assembly 언어이다. 어셈블리어 계의 주석이라고 봐도 무관할 듯 싶다. 따라서 buffer + SFP + RET + \x90 * 1000000 + shellcode 의 구조를 가지고 있을 때, \x90 바이트가 있는 아무 곳이나 RET 로 설정했을 때 정상적으로 Shellcode 가 실행된다는 것이다. 그렇다면 이문제의 경우에 인자값을 완전 크게 만들어 주면 ff 를 ..
-
|Lord Of Bufferoverflow| #8 orge - trollWargame Site/BOF 2019. 5. 20. 16:05
이번에는 인자가 두 개여야 한다는 점과 argv[1] 을 아예 밀어버리는 코드가 추가되었다. 여기서 잠깐, buffer 에는 앞의 40 바이트를 제외하고 그대로 남아 있다는 것을 명심해야한다. SFP , RET 는 그대로 남아 있다는 것이다. 그렇다면, #7 에서 해결했던 방식으로 접근하면 어떻게 될까? 파일이름에 shell code 를 집어넣고, argv[0] 자리로 RET 를 돌려준다면? 문제가 해결될 것이다. 하지만, 여기서 주의해야할 사항이 있다. 파일이름으로는 \x2F 가 들어가면 안된다는 점이다. \x31\xc0\x50\x68\x2f\x2f... 기존에 사용하던 Shell code 는 다음과 같이 \x2F ('/') 이 포함되어 있기 때문에 링크를 생성할 수 없다. \xeb\x11\x5e\x3..
-
|Lord Of Bufferoverflow| #7 darkelf - orgeWargame Site/BOF 2019. 5. 20. 15:03
눈에 띄는 부분이 argv[0] 의 길이가 77 이여야 한다는 것이었다. argv[0] 은 실행파일의 경로가 쓰여있다. 따라서 심볼릭 링크를 사용해서 경로에 이름을 설정해주도록 하자. 물론 cp 한 파일을 대상으로 하면 된다. 주의해야할 점은 75 라는 숫자이다. 실행 할때 ./ 를 붙혀주기 때문이다. 이것까지 경로에 해당되기 때문에 2 를 뺀 75 길이 만큼만 이름으로 지정해주어야한다. 그 결과 77 의 길이를 검사하는 부분을 통과한 것을 알 수 있다. 이번에도 core dump analysis 를 통해 접근해보도록 한다. RET 만 수정해주면 끝이난다. 위와 같은 작업을 orge 파일에 똑같이 적용시켜주면 SHELL 을 따낼 수 있다.
-
|Lord Of Bufferoverflow| #6 wolfman - darkelfWargame Site/BOF 2019. 5. 20. 10:43
자, 이번에는 argv[1] 의 길이가 제한되 있기 때문에 기존의 방식과는 다른 접근을 해야한다. 그 방법은 의외로 단순하다. argv[2] 위치에 shell code 를 넘겨주는 방식으로 접근하면 되니까! RET 를 돌려줄 수 있는 쪽이 한 곳이라도 있다면, 해결되는 문제이다. 첫 번째 인자를 buffer(40) + SFP (4) + RET (4) 형태로 넘겨주고, 두 번째 인자를 shell code 로 넣어주면 SEHLL 을 따낼 수 있을 거 같다, ./darkela `python -c 'print "A"*44 + "\xbf"*4'` `python -c 'print "shell code"'` main 함수 또한 인자를 받고 시작되기 때문에 main 함수의 EBP 밖에는 인자들이 줄줄이 있을 것이다. ..