BOF redhat 원정대 succubus -> nightmare

BOF redhat 원정대 succubus -> nightmare nightmare, nightmare.c 코드를 보면 RET부분에 strcpy의 주소가 들어가야하고 strcpy함수가 끝나고 RET할 주소인 다음 4바이트를 AAAA로 덮어버려 strcpy 다음에 RTL을 방지하고 있다. 이 문제는 strcpy의 argv를 맞춰주어 AAAA로 덮여진 strcpy함수가 끝나고 RET할 주소를 바꿀 수 있다. 메모리 주소를 확인하기...
Read more

BOF redhat 원정대 assassin -> zombie_assassin

BOF redhat 원정대 assassin -> zombie_assassin zombie_assassin, zombie_assassin.c 코드를 보면 이전 문제에서 버퍼, SFP를 초기화 하는 부분이 없어지고 strcpy에서 strncpy로 바뀌어서 SFP, RET까지만 덮을 수 있게 바뀌었다. 전 문제와 같이 RET에는 0xbf와 0x40으로 시작하는 주소로 덮을 수 없어 스택주소와 라이브버리주소를 넣을 수 없다. 주석에 FEBP라고...
Read more

BOF redhat 원정대 gaint -> assassin

BOF redhat 원정대 gaint -> assassin assassin, assassin.c 코드를 보면 RET에 0xbf, 0x40으로 시작하는 주소로 덮게 되면 프로그램이 종료된다. argc는 2이상이어야하고 SFP와 버퍼를 초기화 하는 코드가 있다. RET에 스택, 라이브러리의 주소가 오지 못하기 때문에 RTL을 사용하여 공격해야 한다. ROP를 작성 할 때 '어셈 + ret'으로 된 가젯을 순서대로 나열하여 원하는 행동을...
Read more

BOF redhat 원정대 bugbear -> gaint

BOF redhat 원정대 bugbear -> gaint gaint, gaint.c 코드를 보면 argv를 받고 라이브러리 주소와 함수의 오프셋값을 이용해서 execve함수의 주소값을 저장해 놓는다. 그리고 argv에서 44번째부터 4개가 execve함수의 주소가 맞는지 검사를 한다. 입력값에 execve함수의 주소만 맞추어 프로그램 종료 루틴으로 들어가지만 않게 되면 이전 문제에서 사용하였던 오메가 공격을 할 수 있다. gdb로...
Read more

BOF redhat 원정대 darkknight -> bugbear

BOF redhat 원정대 darkknight -> bugbear bugbear, bugbear.c 코드를 보면 argv[1]이상이 있어야하고 RET에 덮을 시작주소가 0xbf로 시작하면 안된다. 맨위의 주석문을 보면 RTL을 사용하여 풀라는 것을 알 수 있다. RTL은 Return To Lib로 RET를 라이브러리의 함수로 튀게하여 원하는 행동을 수행하도록 하는 것이다. 우리는 쉘을 얻어야하기 때문에 system함수를 사용 할...
Read more

BOF redhat 원정대 golem -> darkknight

BOF redhat 원정대 golem -> darkknight darkknight, darkknight.c 코드를 보면 메인함수에서 argv[1]의 주소를 인자로 problem_child함수를 호출한다. problem_child함수에서는 arv[1]에서 41바이트 만큼을 버퍼로 덮는다. problem_child함수에서 지역변수로 버퍼를 40바이트 잡아 주었기 때문에 41바이트를 복사하면 SFP의 1바이트를 덮을 수 있다. SFP는...
Read more

BOF redhat 원정대 skeleton -> golem

BOF redhat 원정대 skeleton -> golem golem, golem.c 코드를 보면 빠진 제약조건들이 많지만 stack destroyer가 추가 되었다. stack destroyer코드를 보면 버퍼를 초기화하고 RET(buffer+44 ~ buffer+48)을 제외하고 그 아래의 모든 스택을 초기화 해버린다(argv등등 전부 다 초기화 되버린다.) 이렇게 모든 스택을 초기화 해버리면 입력값에 쉘코드를 넣어서 공격하기는...
Read more

BOF redhat 원정대 vampire -> skeleton

BOF redhat 원정대 vampire -> skeleton skeleton, skeleton.c 이전 문제에서 없어졌던 argv[1]길이제한, buffer hunter, egghunter가 다시 생겨나고 argc saver를 이용하는 ultra argv hunter가 생겨났다. ultra argv hunter는 모든 argv를 길이 값까지 확인하여 모두 초기화 시켜버리므로 argv를 이용하기는 어려워보인다. argv까지...
Read more

BOF redhat 원정대 troll -> vampire

BOF redhat 원정대 troll -> vampire vampire, vampire.c  c 코드를 보니 이전 문제에서 추가된 부분도 있고 없어진 부분도 찾을 수 있었다. 먼저 추가된 부분을 찾아보자. argv[1][46]부분에 \xff가 오면 에러 출력 후 프로그램이 종료 된다. 지금가지 우리가 사용해왔던 스택의 주소영역은 모두 0xbfff로 시작하는 영역의 주소였다. 이제 이 부분을 사용 할 수 없다. 없어진...
Read more

BOF redhat 원정대 orge -> troll

BOF redhat 원정대 orge -> troll troll, troll.c C 코드를 살펴보니 이전의 문제에서 argv[1]를 초기화 시키는 부분이 추가 되었다. 이전과 같이 RET는 쉽게 덮어 쓸수 있지만 쉘코드를 넣을 곳이 없다. -에그쉘 불가, 버퍼초기화, argv[1]까지만 받을수 있고 이것도 초기화 남은 곳은 argv[0]이 있다. 이전문제에서 AAAA이름을 갖은 파일을 심볼릭링크로 만들어서 argv[0]의...
Read more

BOF redhat 원정대 darkelf -> orge

BOF redhat 원정대 darkelf -> orge orge, orge.c 이전 문제와 달라진 것을 보면 argv[0]의 길이가 77이 아니면 에러 출력하고 프로그램이 종료된다. argc를 2이상으로 주어야하고  에그쉘을 사용하지 않고 RET는 bf로 시작하는 주소로 덮어야하고 argv[1]의 길이는 48이하로 주어야하고 버퍼가 40바이트 초기화 되므로 메인의 지역변수 버퍼에는 쉘코드를 넣지 말아야한다. argv[0]은...
Read more

BOF redhat 원정대 wolfman -> darkelf

BOF redhat 원정대 wolfman -> darkelf darkelf, darkelf.c c 코드를 보면 이전 문제에서 argv[1]의 길이를 제한하는 코드가 들어가 있는 것을 알 수 있다. 이전문제에서 buffer를 초기화해주어서 RET 이후에 쉘코드를 넣고 버퍼의 주소로 RET를 덮어서 공격하였는데 이번에는 argv의 길이가 제한되어 있어서 뒤에 쉘코드를 추가 할 수 없다. RET는 조작할 수 있지만 쉘코드를 올릴 공간을...
Read more