일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- windosw 문자열
- 파일 시스템
- OSI
- C
- 큐
- pwnable.kr
- Stack
- ftz
- 두근두근 자료구조
- 재귀
- 스택
- c언어
- SWiFT
- LoB
- 백준
- web
- War Game
- ftz level13
- 파이썬
- 자료구조
- PHP
- Java
- 미로 탐색 알고리즘
- 암호수학
- HTML
- 정렬 알고리즘
- windosws wbcs
- System
- 시간복잡도
- level13
- Today
- Total
목록ftz (18)
나의 기록, 현진록
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 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 변수라는 의미이다. ..
ftz level12 level13 setuid 다음은 hint의 내용이다. level11과 다른 점은 str 배열에 저장될 문자열은 실행 인자가 아닌 실행 후 gets로 입력 받는다. level11과 별 다른 점 없으니 크기는 0x108로 똑같다. 환경변수에 쉘코드를 등록하고 주소를 출력하는 코드를 작성한다. 페이로드 작성 level12는 level11과 작성 순서가 다르다. 실행 인자가 아니기 때문에 attackme를 실행시킨 후에 입력해야 한다. 파이프라인( | )을 이용하면 된다. 페이로드는 다음과 같다.
ftz level11 level12의 권한을 가진 파일 현재 level11 권한을 가진 지금도 실행할 수 있는 권한이 있다. hint의 내용이다. 버퍼 오버플로우 즉 버퍼를 넘치게 하는 문제이다. 실행 인자를 입력하면 str 배열에 저장되는데 strcpy는 입력한 그대로 복사를 하기 때문에 256 바이트 이상의 크기도 그대로 수용한다. setreuid(3092,3092) 3092 사용자 권한으로 바꾼다는 의미이다. 3092는 어떤 계정인지 알아보면 level12 계정이다. setreuid 함수로 level12 권한을 가지고 /bin/bash or /bin/sh을 실행하면 level12 계정을 유지할 수 있다. 가장 기본적인 버퍼 오버플로우 기법인 ret 주소를 쉘코드로 덮어 씌운다. ret까지의 거리를 ..