11번 이후의 FTZ 문제 중 가장(?) 어려울지도 모르는 놈이 등장합니다 !FD_SET과 select는 이곳을 보고 공부하세요.간단히 설명하면 위의 코드는 read로 string 변수에 한 글자씩 입력받는 변수입니다.저희가 오버플로우시켜서 값을 바꿀 수 있지만 중요한 것은 리턴을 할수가 없다는 겁니다.그렇기 때문에 string 보다 높은 주소에 있는 check 값을 0xdeadbeef 로 수정해서 쉘을 획득해야 합니다.소스코드가 매우 간단하죠 ? 결과를 한 번 보세요. 신기하지 않나요 ? 사실 저도 배열이 이렇게 사용될 수도 있다는 것을 이 문제를 통해서 알았습니다 -_-;; 정말 신기하더군요.근데 사실 어떻게 생각해보면 당연하기도 하죠. 주소단위로 접근을 하니까요.아무튼 위의 예제를 보셨다면 풀 수 ..
끝이 다 와갑니다 !문제 17번을 보겠습니다.이번에는 전 문제와 달리 쉘을 실행시켜주는 부분이 사라졌네요 !그렇기때문에 저희가 쉘코드를 환경변수에 올려주고 그 부분으로 call을 진행해야 합니다.보시면 fgets로 48개를 받는 것을 볼 수 있는데 40개 이후로 call의 주소 값을 조정할 수 있습니다.결과적으로 0x42424242 라는 주소에는 아무것도 없다고나오면서 에러를 보여줍니다.그렇다면 저 곳에 저희가 올려놓은 쉘코드의 주소를 올려주면 어떻게 될까요 ?위와 같은 소스코드를 작성해주세요. 더 자세한 것을 보시려면 이곳으로 가시면 됩니다.( BOF를 체계적(?)으로 배우실 수 있어요 ! ) 아무튼 컴파일하고 실행해보면,쉘코드의 정확한 위치를 구할 수 있습니다.이를 토대로 공격을 수행해보면,답해봅시다..
FTZ는 당분간 좀 쉬었다 해야겠습니다... 딴 것도 좀 해야지요...일단 문제는 printit(), shell() 함수가 있는데 main()에서 printit()을 실행합니다. 이것을 shell()로 바꿔주면 쉽게 풀립니다.gdb로 분석해보니 printit() 는 0x8048500에 위치하는군요. 그리고 저희가 짜야 할 코드구조는 아래와 같습니다.(python -c 'print "A"*40 + "shell() 함수 주소"';cat) | ./attackmedisass shell 로 shell 함수의 구조를 보니 시작주소가 0x080484d0 이네요. 바로 풉시다 !king poetic !
바로 봅시다 !전 문제와는 다른 점은 check 값에 *가 붙었다는 겁니다. 맨 처음에는 일단 스택 분석해보니까, 아래와 같이 전이랑 같았습니다.(python -c 'print "A"*40 + "deadbeef가 있는 주소"';cat) | ./attackme 를 넣으면 되겠죠 ?그냥 간단히 환경변수에 등록하고 하면 될 줄 알았는데 안되길래 왜 안되나 고민했습니다 (여기서 제가 얼마나 공부를 대충했는지 들키는군요...)gdb로 main ebp에 BreakPoint를 걸고서 분석했습니다....안 되는 이유는 바로... 주소의 맨 처음이 Turtle1000 으로 시작하기 때문입니다... 너무 당연하죠 ???전 쉘코드를 올리면 항상 실행되길래... 환경변수에 등록된 값이 올라가는 것으로 착각했네요 ;; 그래서 ..
이번 문제는 지금까지보다 훨씬 쉽습니다... 고고 !그냥 간단하게 buf를 지나서 check 값을 0xdeadbeef 로 바꿔주면 됩니다.... 너무 간단해서 금방 하시겠죠 ??미리 해보세요 ~~ 정말 쉽다는 것을 느끼실 수 있고 자신감이 엄청나게 향상되실 겁니다 !... 풀어 보셨죠 ?? 그럼 풀어 볼게요 !이번 문제가 정말 쉬운 이유는 쉘코드도 필요가 없다는 것에 있습니다...그냥 [ebp-56] 부터 [ebp-16] 까지의 차를 구한 후 덮어쓰고 후에 0xdeadbeef 라는 값을 써주면 끝나죠... 풀겠습니다 !뭔가 FTZ는 가면갈수록 쉬워지는 느낌이 듭니다...답은 guess what
사실 FTZ는 너무 단순하게 뻔해서 BOF라고 부르기 민망한 정도지만 그래도 가봅시다 !소스코드를 보시면 아시겠지만... 그냥 기존의 11, 12번과 같이 막 넣었다가는 BOF탐지 됐다고 하고 kill로 signal(11, SIGSEGV) 을 전달합니다.이걸 어떻게 우회해야 할까요 ??바로 떠오르는 아이디어는 그냥 값을 덮을 때 i의 값을 0x01234567 로 만들어 주는 것 입니다. 사실 이게 이렇게 보면 매우 간단하고 쉽게 우회가 가능한 것 같지만 실 서버에서는 이 값이 ASLR이라고 해서 계속 바뀌므로 예측하기 힘들게 됩니다. 아무튼 저희가 해야할 건 13번 이므로 바로 풀어볼게요 ~gdb로 분석해봅시다 ! if문의 비교 부분에 BreakPoint를 걸고서 실행시켜 보면,빨간 네모 친 위에 것이 ..
바로 시작 !이번 문제는... 취약점이 두 가지입니다. 포맷 스트링 버그(FSB) 와 버퍼 오버플로우(BOF)죠...근데 사실 저도 아직은 FSB를 잘 설명 못 할 것 같아서... 20번에서 좀 더 가다듬고 설명드리고, 이번에는 BOF로 풀어봅시다 !gdb로 디버깅 하실 때는 복사해서 합니다 ~소스는 간단하니까 바로 보면 지역변수를 위한 공간을 0x108만큼 할당하고 있네요.지역변수가 하나니까 256+8(Dummy)라는 것을 알 수 있는 부분입니다. 그럼 스택의 구조는 아래와 같네요. | str(256) | dummy(8) | ebp(4) | ret(4) | argc(4) | argv |
Level10 풀이 시작 ! 먼저 매번 하는 과정을 해보면 !평소에 없던 program 디렉토리가 존재하고 hint 파일에서는 공유메모리의 키 값을 7530이라고 알려주네요.사실은 처음 문제를 접했을 때에도 그렇게 오래 걸리지는 않았던 문제인 것 같습니다. 그냥 몰라서 리눅스 공유메모리 검색했거든요 -_-;;검색해서 있는 코드들 잘 갖다 썻더니 답 나오드라고요 ㅎㅎ...여기를 참조해서 작성했습니다. 컴파일 후 실행시키면 !다음으로 넘어갑시다 ~
이번 레벨 부터는 Buffer Overflow 부분이 시작됩니다 !일단 매번 하는 것 있죠. 고고싱...좀 길죠...? 하하... 일단 코드 자체만 해석하는 것은 되실거라 믿어 의심치 않습니다... 만 ! 그래도 한 번 해석해보죠. 10바이트를 할당받은 두 개의 변수가 buf2, buf 순서로 선언이 되어있구요."It can be overflow : " 를 출력한 뒤 바로 입력을 받고 있습니다. 입력을 완료하면, buf2 변수와 "go" 문자열을 비교해서 맞으면 Level10의 쉘을 띄워줍니다.그런데 한 가지 이상한 것이 있네요...? buf에 입력을 하는데 왜 buf2에서 "go"를 비교하고 있을까요 ?? 아무것도 모르는 상태에서는 당황할 수 밖에 없습니다.gdb를 이용해서 한 번 살펴보죠 !hint의..
- Total
- Today
- Yesterday
- 우주와컴퓨터
- conftest policy
- cloudsecurity
- aws
- opensource
- REACT
- compliance
- ControlTower
- steampipe
- IAM
- teplate
- 2xx
- Cloud
- JavaScript
- fleet manager
- findinglatestversion
- scp
- stateType
- security
- AWS #CIS
- ViaAWSService
- temlate
- web
- CIS
- .get()
- defaulttheme
- platform
- 계정정보저장
- 4xx
- terraform
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |