일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- windosw 문자열
- C
- War Game
- Stack
- windosws wbcs
- Java
- 파이썬
- 자료구조
- 백준
- 암호수학
- SWiFT
- 두근두근 자료구조
- System
- c언어
- 재귀
- 큐
- 정렬 알고리즘
- 미로 탐색 알고리즘
- web
- OSI
- LoB
- pwnable.kr
- 시간복잡도
- HTML
- 스택
- PHP
- 파일 시스템
- level13
- ftz level13
- ftz
- Today
- Total
목록모두 보기 (257)
나의 기록, 현진록
LOB cobolt bash2 실행 다음은 goblin 파일의 코드이다. 간단한 문제이다. 버퍼 크기가 너무 작으니 환경변수를 사용하자. 환경변수에 쉘코드를 등록하고 쉘코드의 주소를 출력한다. ret까지의 거리를 알아보자. 0x10 -> 16byte 20byte부터 ret 주소이다. 페이로드 작성 페이로드를 작성할 때 goblin 파일의 코드는 실행인자가 아닌 gets으로 입력 받기 때문에 파이프라인을 사용하자.
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으로 채운 후에 쉘코드를 입력한다.
1. .dtors포맷 스트링 버그(이하 FSB)에서 사용하는 부분이다. gcc는 컴파일 할 때 .ctors 와 .dtors 두 영역을 생성한다고 한다. .ctors는 main() 전에 실행되고 .dtors는 main() 종료 후에 실행된다. FSB 기법을 사용할 때는 .dtors 함수가 실행되기 전(main이 끝나기 전)에 쉘 코드 주소를 덮는다. 그렇게 되면 main()이 끝날 쯤 .dtors가 아닌 쉘코드를 실행하게 되는 것이다. 08049594가 main() 문이 끝나고 실행되는 .dtors 함수 주소이다. 즉, main문이 끝나기 전 0x8049594 + 4 = 0x8049598에 쉘코드를 덮으면 된다.
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)..