FTZ level18 문제 확인 FTZ level18 문제는 코드가 갑자기 길어진다. 코드가 길지만 왜 이문제를 냈는지에 대한 관점으로 입력값을 어디서 받는지 스택상 버퍼가 어디에 위치하고 뭘 바꿔야 하는지만 살펴보면 걸러지는 코드가 많아서 긴건 아니다. #include #include #include #include void shellout(void); int main() { char string[100]; int check; int x = 0; int count = 0; fd_set fds; printf("Enter your command: "); fflush(stdout); while(1) { if(count >= 100) printf("what are you trying to do?\n"); if..
파이썬 wordcloud는 중요한 단어나 키워드를 시각화해서 보여주는 시각화 도구이다. wordcloud 자체적으로 빈도수를 계산하는 기능이 있다고 하지만 아무래도 한글의 특성이 있다보니, 나는 한글 명사를 추출하고 빈도수를 계산하는 것까지는 KoNLPy를 사용해주었다. KoNLPy 설치와 KoNLPy를 사용한 한글 명사 빈도수 계산은 아래 포스팅을 참고해주기 바란다. 관련포스팅 KoNLPy (파이썬 한글 형태소 분석기 ) 윈도우 설치 방법 KoNLPy (파이썬 한글 형태소 분석기 ) 윈도우 설치 방법 파이썬 한글 형태소 분석기인 KoNLPy 설치는 아래 기입된 순서대로, 본인 환경(파이썬 버전, 윈도우 비트)에만 맞게 진행해주면 에러가 발생하지 않는다. 참고로 나의 환경은 '파이썬3.8, 윈도우10 x..
KoNLPy 란 아무래도 언어마다 자연어처리를 하기 위한 특성이 제각각이다보니 영어에 맞춰진 자연어처리 도구를 사용하기는 한글에는 맞지 않는다. 그런 이유에서 한글 자연어 처리에 맞춤화된 파이썬 오픈소스 라이브러리인 KoNLPy가 등장했다. 일명 '파이썬 한글 평태소 분석기'이다. 처음엔 당연히 '코엔엘피와이'라고 생각했는데 읽는 방법은 '코엔엘파이'라고 한다. KoNLPy 설치는 pip로 바로 설치되지는 않는다. 그전에 자바 jdk와 Jpype가 설치되어있어야 하는데 자세한 설치 방법은 아래 포스팅을 참고해주기 바란다. 관련포스팅 KoNLPy (파이썬 한글 형태소 분석기 ) 윈도우 설치 방법 KoNLPy (파이썬 한글 형태소 분석기 ) 윈도우 설치 방법 파이썬 한글 형태소 분석기인 KoNLPy 설치는 ..
파이썬 한글 형태소 분석기인 KoNLPy 설치는 아래 기입된 순서대로, 본인 환경(파이썬 버전, 윈도우 비트)에만 맞게 진행해주면 에러가 발생하지 않는다. 참고로 나의 환경은 '파이썬3.8, 윈도우10 x64'이다. 자바 JDK 설치 제일 먼저 아래 오라클 다운로드 페이지에서 자바 JDK를 설치해주어야 한다. https://www.oracle.com/java/technologies/javase-downloads.html Java SE - Downloads | Oracle Technology Network | Oracle Java API Documentation Updater Tool 1.3 Java API Documentation Updater Tool repairs-in-place Java API Do..
FTZ level17 문제 확인 FTZ level16과 비슷해보이지만 하나 다른 점은 이번엔 shell() 없다는 것이다. shell() 함수 없이 call 함수 포인터 변수의 주소값을 어떠한 값으로 덮어써 쉘이 실행되게만 하면 된다. FTZ level17 문제 풀이 level17 풀이는 간단하다. 몇번 환경변수를 사용한 적이 있는데 환경변수에 쉘코드를 등록하고 환경변수의 주소를 덮어써주면 되는 것이다. 일단, 스택 구조부터 확인해보자. char buf[20] : 20바이트 (0x14) dummy : ? void *call : 4바이트 dummy : ? int crap : 4바이트 dummy : ? SFP : 4바이트 RET : 4바이트 입력해준 41414141 버퍼 시작부터 printit 함수 시작 주..
FTZ level16 문제 확인 FTZ level16은 11~15와는 조금 다른 형태의 문제가 출제되었다. call() 함수포인터를 printit() 함수로 지정해놨는데 printit() 함수는 "Hello there!"이라는 문자열을 출력하고 끝난다. 쉘획득을 위한 shell() 함수를 실행시키는 것이 level16의 목표이다. fgets가 있기때문에 48바이트까지는 입력할 수 있다. FTZ level16 문제 풀이 쉘획득을 위한 shell() 함수를 실행시키는 방법 중에 하나로 call() 함수 포인터의 값으로 들어있는 printit() 함수의 주소를 shell() 함수로 변경하는 것이다. 일단, 스택 구조부터 확인해보자. char buf[20] : 20바이트 (0x14) dummy : ? void ..
FTZ level15 문제 확인 level14와 다른점은, level14는 'check==0xdeadbeef' 로 check 변수의 주소값을 체크하는 것이었다면 level15는 check 변수의 주소값이 아닌 값이 0xdeadbeef 인지를 체크하고 있다. 즉, 0xdeadbeef를 메모리에서 찾은 후 그 주소값을 check 포인터 변수에 덮어써야하는 것이다. FTZ level15 문제 풀이 메모리는 이미 0xdeadbeef가 올라와있기 때문에 main 함수 내에서 주소를 찾아주면 된다. 또한, disas main으로 main함수의 어셈블리를 보면 dummy값을 알 수 있다. fgets의 첫번째 인자가 buf이므로 buf 주소는 0xffffffc8이고 그 밑에 cmp문의 0xfffffff0이 check ..
FTZ level14 문제 확인 취약점이 있는 fgets 함수를 이용해 bof를 수행하는 문제인데 check가 0xdeadbeef일 때, system 함수를 사용해 쉘을 실행시키고 있기 때문에 쉘코드를 쓰거나 RET까지 덮어줄 필요는 없어보인다. FTZ level14 문제 풀이 dummy를 잘 알아내는 것이 관건인 것 같은데 다 알아낼 필요는 없이 buf와 check 사이의 dummy 크기만 알아내면 된다. buf (str) : 20바이트 (0x14) dummy : ? buf (check) : 4바이트 dummy : ? buf (crap) : 4바이트 dummy : ? SFP : 4바이트 RET : 4바이트 사실 dummy 크기를 알아낼 필요도 없다. buf 뒤에 check 부분만 0xdeadbeef면 ..
FTZ level13 문제 확인 strcpy 함수가 사용되고 있는 것은 level11과 똑같아 보이는데 i 변수에 0x1234567을 저장해놓고 이 값이 변하면 동작하지 않도록 프로세스를 kill하고 있다. 즉, 0x1234567은 스택이 다른 값들로 덮어써지는 것을 막기 위한 일종의 스택가드라고 볼 수 있다. FTZ level14 문제 풀이 gdb로 실행시켜보면, 'sub 0x418, esp'에서 1048(0x418)-1024-4=20 이므로 i와 buf와 함께 dummy가 20바이트 (0x14) 존재하는 것을 알 수 있다. 하지만 dummy가 정확히 어디 위치하는지를 알아야 정확한 위치에 0x1234567을 써줄 수가 있다. strcpy 함수 호출 뒷부분에 bp를 걸어준 후 버퍼시작 주소를 대략 확인..
FTZ level12 문제 확인 level11과 마찬가지로 attackme 바이너리에 들어있는 gets 취약점을 사용해서 bof로 쉘을 획득해야하는 문제이다. FTZ level12 문제 풀이 gdb로 실행시켜보면, gets 함수를 호출하는 부분을 쉽게 확인 가능하다. 또한, str 버퍼는 256바이트를 할당해주었는데 'sub esp,0x108' 부분에서 dummy가 8바이트임을 알 수 있다. gets 함수 호출 뒤인 에 bp를 건 후 실행시켜 스택을 확인해본다. 0xbfffedd0 에 입력해준 A 값들을 확인할 수 있다. 하지만, 이번 문제도 어차피 랜덤스택(ASLR)이기 때문에 버퍼 주소는 계속 바뀐다. 일단 스택 상황은 아래와 같다. buffer (str) : 256바이트 (0x100) dummy :..
y2017년에 옛날 블로그에 작성했던 FTZ 풀이를 level11부터 옮깁니다. FTZ level11 문제 확인 FTZ Level11 부터는 bof로 풀 수 있는 문제들이 나온다. 디렉토리에 있는 파일들을 먼저 살펴보면, attackme라는 취약점이 존재하는 바이너리가 있고 setuid가 걸려있는 것으로 보인다. 그리고 hint 파일이 있는데 attackme의 소스코드인 것 같고 살펴보면 bof에 취약한 strcpy 함수를 사용하고 있다. char형 배열 str은 256 크기를 갖고 있는데 strcpy로 길이체크가 수행되지 않은 argv[1]을 str로 복사하고 있으니 버퍼오버플로우 취약점을 갖고 있는 것을 쉽게 확인할 수 있다. 여기서 한가지 알고 넘어가야 할 것은, 해당 바이너리의 취약점을 실행해서 ..
C언어로 개발하는 PE Viewer(PE 뷰어) 세번째 포스팅에서는 지난 포스팅의 NT 헤더에 이어서 섹션 헤더(IMAGE_SECTION_HEADER) 구조체 배열을 파싱해볼 것이다. 섹션 헤더는 정해진 갯수대로 있는 것이 아니라 PE 파일마다 다르기 때문에 분석 후 파싱하는 코드를 짤 때 주의해야 한다. Section Header (IMAGE_SECTION_HEADER) 섹션 헤더의 IMAGE_SECTION_HEADER 구조체는 하나가 아니라 구조체 배열이다. IMAGE_SECTION_HEADER 정의 IMAGE_NT_HEADER 구조체에 이어서 IMAGE_SECTION_HEADER 구조체의 배열이 온다. PE 파일은 code, data, resource 등을 각각의 섹션으로 나누어 저장하는데 이에 관..