일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 시간복잡도
- 정렬 알고리즘
- Stack
- System
- windosws wbcs
- HTML
- 미로 탐색 알고리즘
- 파이썬
- OSI
- 암호수학
- pwnable.kr
- windosw 문자열
- 백준
- LoB
- 큐
- 재귀
- Java
- 스택
- 자료구조
- War Game
- SWiFT
- ftz level13
- PHP
- ftz
- C
- 파일 시스템
- web
- 두근두근 자료구조
- c언어
- level13
- Today
- Total
목록War Game (41)
나의 기록, 현진록
LOB gremlin 다음은 cobolt 파일의 코드이다. 이것도 간단한 버퍼 오버플로우 문제이다. ret까지의 거리를 알아보자. 0x10 -> 16 20byte부터 ret의 주소이다. 20byte부터 쉘코드를 넣으면 된다. 이 문제는 ret까지의 거리가 비교적 적기 때문에 환경변수를 이용해 쉘코드의 주소를 입력해야 한다. 일반적으로 쉘코드의 크기는 적어도 보통 23byte~27byte 정도로 이는 ret까지의 거리 20byte를 초과하기 때문이다. 쉘코드의 주소를 알아보자. 페이로드 작성
LOB gate 제일 먼저 bash2 실행 bash 상태에서 한참을 고생했다. gremlin 파일은 gremlin 권한을 가진다. 쉘을 실행하면 gremlin 권한의 쉘을 가질 수 있다. 다음은 gremlin의 코드이다. 간단한 버퍼 오버플로우 문제이다. ret 주소에 쉘코드를 넣자. 먼저 ret까지의 거리를 알아보자. 0x100 -> 256 ret까지의 거리는 260이다. 쉘코드를 환경변수에 넣고 쉘코드의 주소를 출력하자. 다음은 쉘코드의 주소이다. 페이로드 작성 260부터가 ret 주소이므로 260을 nop으로 채운 후에 쉘코드를 입력한다.
ftz level20 다음은 hint의 내용이다. setreuid는 있지만 /bin/sh은 존재하지 않다. ret 주소를 수정하기엔 fgets의 입력 크기가 79 밖에 되지 않는다. printf 문을 보자. printf문은 보통 포맷 스트링을 활용하여 출력하는데 코드에서는 포맷스트링을 사용하지 않고 입력 받는대로 bleh에 저장된 값이 printf에 의해 그대로 출력된다. 포맷 스트링을 입력해보자. %x을 입력하면 부호 없는 16진수가 출력 그 위치에 대한 주소이다. AAAA는 어디에 저장될까. 4번째부터(12byte) 저장되는 것을 확인 했다. printf부터 bleh 변수의 거리는 12byte이다. 포맷 스트링 버그를 이용해보자. ret까지의 거리를 확인하려고 했으나 gdb로 확인할 수 없다. 그렇다..
ftz level19 다음은 hint의 내용이다. setreuid 와 /bin/sh이 없다. ret 값에 setreuid와 /bin/sh이 포함된 쉘코드를 넣으면 된다. ret까지의 거리를 알아보자. 0x28은 40이고 44byte부터 ret의 주소이다. 페이로드 작성
ftz level18 다음은 hint의 내용이다. 좀 길지만 핵심은 check 변수에 0xdeadbeef가 있으면 shellout 함수를 실행하고 shellout 함수의 내용은 문제를 풀기 위한 코드가 있다는 것이다. check 변수의 거리를 알아내자 main+91을 보면 ebp-104와 0xdeadbeef을 비교한다. ebp-104가 check 변수이다. ebp-104에 0xdeadbeef를 넣어야 한다. 페이로드를 작성해야 하는데 hint의 내용을 조금 더 알아보자. switch 문의 default를 보면 표준 스트림으로 받아온 문자열을 string 배열 count 위치에 저장할 것이다. count는 0으로 초기화되어 있다. 그러나 string 배열이 check 배열보다 더 높은 주소에 있다. 즉, ..
ftz level17 다음은 hint의 내용이다. level16과 조금 다르다. 일단 눈에 띄는 것은 setreuid 함수는 있지만 system(/bin/sh); 가 없다. 어떻게든 /bin/sh만 실행시키면 된다. 단, 3098 계정 권한을 가진 상태에서 /bin/sh을 실행해야 한다. 그렇다면 call()을 이용하여 문제를 풀어보자. call에 쉘코드 주소를 넣으면 될 것 같다. call까지의 거리를 알아보자. call까지의 거리는 ebp-16 40btye부터 call 함수의 주소이다. 40byte부터 쉘코드의 주소를 넣는다. (0x8048490이 printit 함수의 주소이다.) 쉘코드 주소를 출력하고페이로드 작성
ftz level16 다음은 hint의 내용이다. shell 함수를 실행 시켜야 문제를 풀어낼 수 있지만 printit 함수만 호출하고 있다. main을 보면 call 포인터 변수에 printit이 저장되어 있다. printif 함수의 주소가 저장되어 있을 것이다. 그렇다면 call 포인터 변수에 shell 함수의 주소를 넣으면 될 것 같다. shell 함수의 주소를 알아보자. printit 함수와 shell 함수의 주소가 보인다. 현재는 0x08048500이 call 포인터 변수에 저장되어 있다. main문을 보자. main+6을 보면 ebp-16에 printit 함수의 주소가 저장되어 있다. ebp-16에 shell 함수의 주소를 넣어보자. 총 56 byte 이므로 call 포인터 변수(ebp-16)..
ftz level15 다음은 힌트의 내용이다. level14와 다른 점은 check가 포인터 변수이다. 포인터 변수는 주소를 저장한다. 즉 0xdeadbeef가 저장되어 있는 주소를 check에 넣어주면 된다. 0xdeadbeef가 저장된 주소를 찾아보자. 0x80484b0 라인에 beef ///// dead가 보인다. 0xdeadbeef가 있는 주소는 0x80484b2이다. 페이로드 작성
ftz level14 다음은 hint의 내용이다. check에 0xdeadbeef가 저장되어 있다면 성공이다. check의 거리를 알기 위해서 gdb를 실행시킨다. main+29 내용을 보면 ebp-16에 저장되어 있는 값과 0xdeadbeef를 비교한다. 즉 check 변수의 위치는 ebp-16이다. sfp까지의 거리가 56byte이므로 check 변수의 거리는 56-16=40 byte 부터이다. 페이로드 작성 40byte부터 0xdeafbeef를 입력하면 끝이다.
ftz level13 다음은 hint의 내용이다. 버퍼 오버플로우 기법으로 ret 값에 쉘코드의 주소를 넣으면 된다. 단, i 변수에 저장된 값이 0x1234567을 그대로 보존해야만 한다. ret까지의 거리와 i 변수의 거리를 알아야 한다. ebp부터 sfp까지의 거리는 0x418 -> 1048byte이다. 1052byte부터 ret의 주소 0x1234567이 저장된 곳을 확인해보자(굳이 안 해도 된다.). 0x01234567(==0x1234567)이 저장되어 있음 그렇다면 ebp부터 i변수가 저장된 곳은 어디일까 AT&T 문법에서 intel 문법으로 바꿔보자. main+69를 보면 0x1234567을 ebp-12와 비교한다. hint의 내용에서 if문에 속한다. ebp-12은 i 변수라는 의미이다. ..