LOB, wolfman -> darkelf 문제 확인 저번 문제와 다른점은, argv[1] 길이체크를 한다는 것이다. 점점 제약조건이 추가되고 있는데 정리하자면 아래와 같다. 환경변수 초기화 버퍼 초기화 arvg[1] 길이체크 48번쨰 바이트 \xbf LOB, wolfman -> darkelf 풀이 현재 스택 상황은 아래와 같다. 참고로 argc, argv[1], argv[1], ... 는 RET 뒤 어딘가 오게된다. i (4) buffer (40) SFP RET ... argc argv[0] argv[1] RET 뒤에 argv 값들의 위치가 정확히 어떻게 되는지 확인해보기 위해 argv[1]과 argv[2]에 A와 B를 각각 넘겨주었다. 쭉쭉 내리다보면 아래 부근에서 0x42 값을 확인할 수 있다. a..
LOB, orc -> wolfman 문제 확인 level4 문제와 거의 동일한데 마지막에 버퍼를 memset으로 초기화한다는 것만 다르다. 어차피 RET 뒤에 쉘코드를 주어서 풀었었기 때문에 버퍼 초기화는 영향이 없다. 따라서 이전 문제와 동일한 방식으로 풀이를 진행하도록 한다. LOB, orc -> wolfman 문제 풀이 현재 스택 상황은 아래와 같다. i buffer SFP RET 4 40 4 4 strcpy 호출 뒤인 main+194에 bp를 건 후 실행시키고 버퍼 주소값을 확인해준다. LOB, orc -> wolfman 익스플로잇 RET 앞에 44바이트 더미값을 준 다음 RET 자리에 덮어쓸 주소로 위 스택에서 확인한 적당한 주소값을 준다. 그리고 그 뒤에 nop과 쉘코드를 준다. ./wolfm..
LOB, goblin -> orc 문제 확인 strcpy 취약점을 이용해 bof를 하는 문제인데 앞에 2개정도 고려할 요소가 생겼다. 첫번째는 egghunter로 환경변수를 전부 초기화하고 있기 때문에 환경변수를 사용하지 않고 문제를 풀어야 한다는 것이고 두번째는 argv의 48번째 값이 \xbf여야 한다는 것이다. LOB, goblin -> orc 풀이 main문을 gdb로 확인해주면 일단 dummy값은 없는 것으로 확인되기 때문에 스택 상황은 아래와 같다. i buffer SFP RET 4 40 4 4 환경변수를 사용하지 못하기 때문에 gdb상에서 입력값이 저장되는 버퍼 주소값을 알아낼 필요가 있다. strcpy 바로 뒤인 main+194에 bp를 건다. 그리고 48번째 바이트가 \xbf가 아니면 프..
LOB, gremlin -> cobolt 문제 확인 gate -> gremlin 문제와 거의 동일한 문제로 strcpy 취약점을 이용한 bof 문제이다. LOB, gremlin -> cobolt 문제 풀이 gdb로 main문을 먼저 확인해본 결과 0x10을 할당하고 있으므로 dummy는 없는 것 같다. 따라서 스택 상황은 아래와 같다. buffer SFP RET 16 4 4 환경변수에 쉘코드와 nop을 100정도 주어 저장한 다음, 환경변수 주소를 알아낸다. LOB, gremlin -> cobolt 익스플로잇 환경변수 주소를 RET에 덮어주기만 하면 되기 때문에 앞단에 dummy값은 20바이트를 채워주면, 다음 단계로 가는 패스워드를 얻을 수 있게된다.
LOB, cobolt -> goblin 문제 확인 앞에 두문제와 거의 유사한 문제이지만 scanf 취약점에서 gets 취약점을 활용해서 bof를 해야한다는 점만 변경되었다. gets 함수는 사용자에게 입력받는 값의 길이를 체크하지 않기 때문에 bof에 취약한 함수이다. LOB, cobolt -> goblin 풀이 gdb로 main문을 살펴보니 총 0x10바이트(16)를 할당하는 것으로 보아 dummy 값은 없는 것으로 보인다. 따라서 스택 상황은 아래와 같다. buffer (16) SFP (4) RET (4) 먼저 앞단에 nop이 100정도 들어가있는 쉘코드를 환경변수에 올려준 후 주소값을 구해준다. LOB, cobolt -> goblin 익스플로잇 그리고 RET에 환경변수 주소 4바이트만 덮으면 되기 ..
해커스쿨의 Lord Of Bufferoverflow(LOB) 는 여러 bof 문제를 경험할 수 있는 환경?으로 보통 FTZ를 끝마쳤으면 LOB를 풀게된다. 2017년도에 풀고 블로그에 풀이를 올렸었는데 블로그를 여기로 이전하는 바람에 다시 작성하게 되었다. 초기설정 초기설정을 해놓치 않고 시작하면 엄청난 삽질을 경험할 수 있다. 난 링크(LOB 다운로드 & 초기설정)를 참고해서 초기설정을 진행해주었다. 초기설정은 아래와 같이 /etc/passwd의 bash를 전부 bash2로 변경하는 작업이다. 그다음 IP주소를 확인해주고 XShell이든 Putty든 연결해준다. 난 앞으로 XShell을 사용해서 문제풀이를 진행하도록 하겠다. LOB, gate -> gremlin 문제 확인 gate -> gremlin ..
컴퓨터를 매우매우 좋아하는 집순이.... 아직 많이 부족하지만 조금이라도 더 컴잘알이 되기 위해 노력중이며 공부한 내용을 잊어버리지 않기 위해, 내가 갖고 있는 지식의 범위를 넓히기 위해, 정말 관심있는 분야는 수직으로 깊게 파기 위해 블로그를 운영하기 시작했다. 또한, 정보보안의 경우 처음 독학할 때의 막막한 심정을 알기 때문에 나와 비슷한 상황을 겪고 있는 사람들에게 조금이나마 도움이 되고 싶었다. 나도 아직 초짜지만 누군가 댓글로 도움이 많이 되었다거나 질문을 할 때면 여간 뿌듯하지 않을 수 없다. 반대로 지적 당하는 것도 좋아한다. 틀린 내용에 대한 피드백은 매우매우 환영한다. 어쩐지 매일 공부하는 것 같은데 공부를 하면 할수록 내가 뭘 모르는지에 대한 지식만 많아지는 중이다. 얼마나 포스팅을 많..
C언어로 개발하는 PE Viewer(PE 뷰어) 다섯번째 포스팅에서는 지난 포스팅에 Import Directory Table 에 이어서 PE 파일 파싱의 꽃? 이라고 할 수 있는 IAT(IMAGE Address Table)와 INT(Image Name Table)를 파싱해보도록 한다. IAT와 INT에 접근하기 위해선 Import Directory Table에 대한 접근이 필수인데 관련 내용은 아래 포스팅에서 참고하길 바란다. PE Viewer 개발 (4) - IMPORT Directory Table PE Viewer 개발 (4) - IMPORT Directory Table C언어로 개발하는 PE Viewer(PE 뷰어) 네번째 포스팅에서는 지난 포스팅의 섹션헤더에 이어 IMPORT Directory T..
C언어로 개발하는 PE Viewer(PE 뷰어) 네번째 포스팅에서는 지난 포스팅의 섹션헤더에 이어 IMPORT Directory Table을 파싱해볼 것이다. 나중에 포스팅할 IAT나 INT와 같은 테이블을 파싱하기 위해 꼭 필요한 테이블이다. IMPORT Directory Table (IMAGE_IMPORT_DESCRIPTOR) IMPORT Directory Table은 IMAGE_IMPORT_DESCRIPTOR 구조체 배열로 이루어져 있으며 여태까지 살펴본 PE 헤더가 아닌 PE body에 위치해있다. PE 파일은 자신이 어떤 라이브러리를 임포트하고 있는지 IMAGE_IMPORT_DESCRIPTOR 구조체에 명시하고 이 구조체 배열이 들어있는 테이블이 IMPORT Directory Table이다. I..
pintool은 DBI(Dynamic Binary Instrumentation) 툴 중 하나로 리눅스에서는 pintool 사용이 쉬운편인데 윈도우용 Pin은 정리된 글이 많이 없어서인지 사용하는데 삽질을 좀 했다. cygwin64, Window pin 다운로드 64bit라는 가정하에 cygwin64, 윈도우용 Pin, 비쥬얼스튜디오 x64 가 필요하다. cygwin64 다운로드 및 설치 일단 첫번째로 cygwin은 64bit 버전으로 아래 링크에서 다운받는다. cygwin 다운로드 페이지 Cygwin Installation Cygwin Get that Linux feeling - on Windows Installing and Updating Cygwin Packages Installing and Upda..
OP에는 GOT Overwrite, RTL Chaining 등의 개념이 혼합되어 있다. DEP를 우외해 익스플로잇을 하기 위한 ROP에 대해 해당 게시글에서 차근차근 정리해나가려고 한다. 가젯(gadget) 이란 ROP에서 자주 등장하는 개념인 가젯이란 ret으로 끝나는 명령 조각을 말한다. (INT + ret 형태) 대표적으로 'pop - pop - return', 일명 PPR이 있다. 이러한 가젯을 사용해 내가 원하는 상황에 맞게 스택 포인터를 적당히 이동시켜주는 것이 중요하다. (ret을 사용해 esp로 돌아가고 esp를 올리기 위해 pop을 사용하고 등) VirtualProtect()를 호출하여 DEP를 해제하는 방식 다양한 방식이 존재하지만, 그 중 가장 손쉽게 DEP를 해제할 수 있..
여기 적혀있는 내용은 심볼이 없는 덤프에서 vtable 영역을 어떻게 하면 찾을수 있을까에 대한 개인적인 의견이기 때문에 정확한 정보가 담긴 포스팅은 아니다. 참고용으로만 확인해주길 바라며 틀린 내용에 대한 지적은 언제든 환영이다. 심볼이 있는 경우 심볼이 있는 경우 vtable 영역을 찾는 건 쉽다. 아래 포스팅에서도 기술했다시피 와 같은 방식으로 간단히 찾을 수 있기 때문이다. 가상 함수 호출 패턴 검색 하지만 심볼이 없는 경우는 얘기가 달라진다. 심볼이 없으면 `vftable' = 과 같이 표시가 되지 않기 때문에 위와 같은 방식으로 간단하게 vtable 영역을 찾을 수 없게된다. 그래서 처음 생각한 방식이 가상 함수 호출 패턴과 비슷한 코드(레지스터에 넣은 후 ..