Write-Up 30

LOB: orc->wolfman

1. wolfman.c 분석 - argv[1][47] == "\xbf" 을 지키도록 페이로드 작성해야 함 - memset(buffer, 0, 40) -> 버퍼에다 오버플로 불가, argv[2]에 쉘코드 삽입 예정 먼저 write-up을 올린 troll과 비슷하게 페이로드를 작성할 수 있다. 2. 디버깅 strcpy 직후 bp 건 후, argv[2]의 위치 확인 "\xbf"*48을 통해 if 구문 우회 후 A가 저장된 공간을 확인할 수 있다. 대충 0xbffffad4를 argv[2]의 주소로 사용할 예정. 3. 페이로드 작성 ./wolfman $(python -c 'print "\x90"*44+"\xd4\xfa\xff\xbf"+"\x90"*200+ "\x31\xc0\x50\x68\x2f\x2f\x73\x6..

Write-Up/LOB 2019.12.04

LOB: succubus -> nightmare

1. nightmare.c 분석 - addr : strcpy()의 주소 - argv[1] : 사용자가 입력한 인자, 버퍼에 복사됨 - RET : buffer+44 => RTL 기법 이용, RET에 strcpy 주소를 넣어야 함 흐름을 살펴보면 마지막 memset() 함수를 이용하여 ret+4의 주소부터 4바이트를 A로 채운다. 이때 strcpy() 함수를 삽입시키면 버퍼의 문자열 전부를 RET+4부터 복사할 수 있다. => 버퍼에 RTL 기법을 이용하여 system() 함수로 쉘을 얻을 수 있다. 2. 디버깅 라이브러리에 저장된 system() 주소를 얻어온다. 어셈블에 있는 strcpy() 주소도 얻을 수 있다. 3. 페이로드 작성 페이로드는 다음과 같이 이뤄진다 system() + dummy + "/..

Write-Up/LOB 2019.11.28

LOB: troll->vampire

1. vampire.c 확인 두번의 if 구절을 피해야함. a. argv[1][47] == "\xbf" b. argv[1][46] != "\xff" 이에 맞게끔 주소를 할당해야 함. 다만 스택의 윗부분은 커널이 존재하므로 argv[2]를 이용하여 "0xbfff" 영역에서 벗어날 수 있도록 페이로드를 구상할 것. 2. 디버깅 - 어셈블러 분석 a. 함수의 프롤로그부분에 bp를 설정하고 ebp의 위치를 찾아 스택이 어디로 할당되었는지 확인한다. 확인해보면 스택이 0xbffe7478에 할당되어 있다. 더 아래쪽의 메모리를 확인해보면 인자값이 다음과 같이 들어간 것을 확인할 수 있다. 대략 0xbffe75f8을 argv[2]의 위치로 고른다. 4. 페이로드 ./vampire $(python -c 'print "..

Write-Up/LOB 2019.11.28

FTZ:Level 19

1. hint 로 attackme 소스코드 확인 stdin에서 값을 입력받아 buf 배열에 저장한 후, printf 함수를 이용하여 출력한다. 쉽게 생각하면 RTL 기법을 이용하여 system("/bin/sh"); 를 ret 부분에 넣으면 될 것 같지만 코드 내부에 권한 상승을 시켜주는 setreuid() 함수가 없어 총 두번의 함수를 강제로 호출시켜주어야 하는 문제이다. => RTL Chaining 기법 필요. 2. RTL Chaining RTL 기법은 ret에 공유 라이브러리의 함수 주소를 넣어 임의의 함수 호출을 한번만 진행한다. 하지만 RTL Chaining 기법에서는 새로 호출한 함수의 RET 부분에 지속적으로 RTL 기법을 이용하며 스택의 포인터를 다음 함수로 보내는 방법을 사용할 수 있다. ..

Write-Up/FTZ 2019.11.28

LOB: gremlin->cobolt

gremlin의 홈 디렉토리에 있는 colbolt.c를 확인해보면 첫번째 인자값을 버퍼에다 복사하여 버퍼를 출력하는 코드이다. 두가지 방법을 이용하여 문제를 풀어보도록 하자. 1. 환경변수를 이용한 쉘코드 익스플로잇 항상 하던 대로 다음과 같이 SHELLCODE라는, 쉘코드를 담은 환경변수를 저장합니다. 환경변수의 주소를 출력하는 코드를 간단하게 짜고 실행하여 SHELLCODE 환경변수의 주소를 알아낸다. cobolt 프로그램의 스택을 보면 str에 할당된 16바이트 뒤에 바로 함수 에필로그가 들어가므로 다음과 같이 쉘코드를 짤 수 있다. 2. RTL을 이용한 exploit RTL : Return-to-libc. 메모리에 적재된 공유 라이브러리를 이용해 원하는 함수를 끌어다 쓰는 공격 기법이다. 일반적으..

Write-Up/LOB 2019.11.27

LOB: gate - 수정중

FTZ를 거의 끝내가서 LOB를 시작했다. 아직 조금 남았지만 LOB를 병행하며 하기로 했다. 밀린 FTZ는 미래의 내가 하겠지... FTZ와 달리, LOB는 로그인을 연결 후 진행한다. 가장 첫번째 계정은 ID : gate / PW : gate로 로그인할 수 있다. 시작하면 다음과 같이 두 파일이 존재한다. (gremlin만 grep으로 뽑은 이유는 풀면서 만든 파일이 존재하기 때문) 실행 파일인 gremlin부터 살펴보면, gremlin으로 set-uid가 설정되어 있다는 것을 알 수 있다. LOB의 특징은 다음 레벨의 ID를 실행 파일의 이름으로 정해놓는다는 것이다. 즉, 우리가 이번 gremlin 파일을 BOF 하여 얻은 password는 gremlin에 로그인하여 사용해야 하는 것. 버퍼 위치가..

Write-Up/LOB 2019.11.22

FTZ: Level17

setreuid 함수가 level18로 권한을 올려주는 함수. 이 뒤에 call이 호출되므로 미리 buf에 쉘코드를 넣어놓고 call에 buf의 주소를 넣으면 될 줄 알았으나..! FTZ 상태가 이상한건지 내가 주소를 읽는 눈치가 이상한건지 한번도 맞아떨어지지 않으므로 마음 편하게 쉘코드를 환경변수로 저장하기로 했다. 다음과 같이 환경변수를 만들고, getenv라는 $SHELLCODE 전용 주소 알아내기 코드를 짠다. 다음과 같이 코드를 찾을 수 있다. 다음과 같이 nop sled를 40바이트 넘기고, call이 가리키는 위치에 환경변수의 주소를 넣어주면 바로 익스플로잇 되어 비밀번호를 탈취할 수 있다. 쉘코드 출처 더보기 http://blog.naver.com/PostView.nhn?blogId=sth..

Write-Up/FTZ 2019.11.20

FTZ: Level15

*level14 와 차이점 : check가 가진 주소를 받느냐 or check가 가리키고 있는 곳 내부의 값을 받느냐 1. buf에 0xdeadbeef를 입력한 후, BOF를 통해 check가 buf의 주소를 가지게 함. (문제 : 스택 주소는 실행시마다 바뀜. 프로그램이랑 눈치싸움 필요) 간단하게, buf에서 check까지는 40바이트 거리니 0xdeadbeef*10+(buf 주소 - 4바이트) 를 해주자. 그럼 중요한 것은 buf의 주소를 어떻게 찾느냐. if문 안에서 deadbeef가 맞는지 비교하기 직전에 브레이크 포인트를 걸고, 프로그램 실행. 인자값으로는 찾기 편하게 AAAAA를 넣어줄 예정 (메모리에 0x41로 들어감) 딱 버퍼자리에 AAAAA가 잘 들어간 것을 확인할 수 있음. check는..

Write-Up/FTZ 2019.11.20

FTZ: Level11

이제는 hint를 출력하면 설명이 없이 소스코드를 출력한다. 아마 폴더에 같이 있던 attackme의 소스코드일 것으로 판단한다. 이번에는 3092번으로 uid를 설정한다. 확인해보면 level12의 uid인 것을 확인할 수 있다. 코드는 간단하게 프로그램 실행할 동시 parameter를 받고, 그 첫번째 값을 str에 저장하고, 출력한다. uid는 level12의 것으로 바뀌지만, 그외에 명령을 실행할 수 있는 방법이 없다. 인자값에 쉘코드를 박아, printf를 리턴할 때 쉘코드로 넘어가 쉘을 올리면 level12의 권한을 가진 쉘을 실행할 수 있다. argv[1]의 값을 str에 저장하기 때문에, argv[1]에 쉘코드를 입력하여 놉슬레드를 태워 ret까지 넘기는 방법이 존재하는데 스택의 주소가 실..

Write-Up/FTZ 2019.11.13